Limit kompozitné primárny kľúč sa len jeden záznam ako "vypúšťa" (kde viac "vypúšťa" záznamy nie uplatniť obmedzenia)

0

Otázka

Chcete použiť zložený primárny kľúč tak, aby sa obmedzil iba jeden záznam je k dispozícii pre prod.

Tabuľka: user_id text, well_id text, deleted int, [other attributes]

Navrhované primárny kľúč: (user_id, well_id, deleted)

Jedinečnosť je tu naozaj len vzťahujúce sa na jeden záznam, ktorý je jedinečná kombinácia: user_id + well_id + deleted = 0 ...

Inými slovami, mohli by mať viaceré záznamy, kde user_id + well_id + deleted = 1 (zmazaný hodnota je len vypúšťajú značky)? Práve teraz, mám na mysli práve definovanie že deleted značka predstavuje "vymazané", keď je > 0, a tak som mohol len prírastok pre všetky zmazané záznamy. Ale myslel som si, že niekto má pravdepodobne lepší nápad.

constraints delete-row postgresql
2021-11-20 00:47:26
1

Najlepšiu odpoveď

2

Môžete dosiahnuť jedinečnosť s nemenné kritériá, ktoré je deleted = 0 vo vašom prípade.

Tu je vzorka inštalácie;

create table table1 (
  id serial primary key,
  user_id text, 
  well_id text, 
  deleted int
);

-- the index is unique only for the records which have deleted = 0 
create unique index on table1 (user_id, well_id) where deleted = 0; 
 
insert into table1 (user_id, well_id, deleted) values ('user1', 'well1', 0);
insert into table1 (user_id, well_id, deleted) values ('user1', 'well1', 1);
-- this statement doesn't throws error
insert into table1 (user_id, well_id, deleted) values ('user1', 'well1', 1);
insert into table1 (user_id, well_id, deleted) values ('user2', 'well2', 0);

select * from table1;
id user_id well_id odstránené
1 používateľ1 well1 0
2 používateľ1 well1 1
3 používateľ1 well1 1
4 používateľ2 well2 0
-- Finally, this statement throws an error
insert into table1 (user_id, well_id, deleted) values ('user1', 'well1', 0);  

ERROR:  duplicate key value violates unique constraint "table1_user_id_well_id_idx"
DETAIL:  Key (user_id, well_id)=(user1, well1) already exists.

db husle tu

2021-11-20 06:07:04

To by bolo lepšie mať deleted byť boolean. Ale je to správne riešenie!
Laurenz Albe

Ďakujeme, že ste @Sahap Asci! To je veľmi užitočné!
MC Hammerabi

@LaurenzAlbe - dohodnúť sa na boolean...ale comprimising b/c dev tím preferencie.
MC Hammerabi

"Tím vývojárov preferencie", hmpf. Takže ak nevedia, alebo nemajú radi dátový typ, aj keď je to ten správny, nie je zvyknúť?
Laurenz Albe

V iných jazykoch

Táto stránka je v iných jazykoch

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................