Limit kompozitní primární klíč pouze jeden záznam jako "smazané" (kde je více "smazané" záznamy není dovolávat omezení)

0

Otázka

Chcete použít kompozitní primární klíč tak, aby byl omezen pouze jeden záznam k dispozici u prod.

Tabulka: user_id text, well_id text, deleted int, [other attributes]

Navrhované primární klíč: (user_id, well_id, deleted)

Jedinečnost je zde pouze skutečnosti vztahující se k jednomu záznamu, který je unikátní kombinací: user_id + well_id + deleted = 0 ...

Jinými slovy, může mít více záznamů, kde user_id + well_id + deleted = 1 (odstraněna hodnota je jen odstraněné značky)? Teď mám na mysli jen definovat, že deleted značka představuje "smazané", pokud je > 0, takže jsem mohl jen přírůstek pro všechny odstraněné záznamy. Ale myslel jsem si, že asi někdo, kdo má lepší nápad.

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

Nejlepší odpověď

2

Můžete dosáhnout jedinečnosti s neměnná kritéria, která je deleted = 0 v tvém případě.

Zde je ukázka nastavení;

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 vypouští se
1 uživatel1 well1 0
2 uživatel1 well1 1
3 uživatel1 well1 1
4 user2 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 housle zde

2021-11-20 06:07:04

Bylo by lepší mít deleted být boolean. Ale to je správné řešení!
Laurenz Albe

Děkuji @Sahap Asci! To je velmi užitečné!
MC Hammerabi

@LaurenzAlbe - dohodnout se na boolean, ale comprimising b/c dev team preferencí.
MC Hammerabi

"Vývojářský tým preference", hmpf. Takže pokud o nich neví, nebo nelíbí, datový typ, i když to je správné, to není zvyknout?
Laurenz Albe

V jiných jazycích

Tato stránka je v jiných jazycích

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