Limite de clé primaire composite à un seul dossier comme "supprimé" (où plusieurs "supprimé" les enregistrements de ne pas invoquer la contrainte)

0

La question

Souhaitez utiliser une clé primaire composite de façon à limiter un seul enregistrement disponible pour la prod.

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

Proposé de clé primaire: (user_id, well_id, deleted)

L'unicité ici n'est vraiment liée à un enregistrement qui est une combinaison unique: user_id + well_id + deleted = 0 ...

En d'autres termes, peut avoir de multiples dossiers où user_id + well_id + deleted = 1 (supprimé la valeur est simplement la suppression du marqueur)? Maintenant, je pense juste à la définition que l' deleted marqueur représente "supprimé" quand il est > 0, donc j'ai juste l'incrément pour tous les enregistrements supprimés. Mais j'ai pensé que quelqu'un a probablement une meilleure idée.

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

La meilleure réponse

2

Vous pouvez obtenir de l'unicité d'un immuable critères qui sont deleted = 0 dans votre cas.

Voici l'exemple de l'installation;

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 supprimé
1 user1 well1 0
2 user1 well1 1
3 user1 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 violon ici

2021-11-20 06:07:04

Il serait préférable d'avoir deleted être un boolean. Mais c'est la bonne solution!
Laurenz Albe

Merci @Sahap Asques! Ceci est extrêmement utile!
MC Hammerabi

@LaurenzAlbe - s'entendre sur les booléens...mais comprimising b/c de la dev team préférences.
MC Hammerabi

"L'équipe de développeur préférences", hmpf. Donc, si ils ne savent pas ou n'aime pas un type de données, même si c'est la bonne, elle n'est pas utilisée?
Laurenz Albe

Dans d'autres langues

Cette page est dans d'autres langues

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