Límite de clave principal compuesta de un solo registro como "no se elimina" (donde varios "eliminado" de los registros de no invocar restricción)

0

Pregunta

Desea utilizar una clave principal compuesta de forma que se limite sólo un registro disponible para prod.

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

Propuesta de clave primaria: (user_id, well_id, deleted)

La singularidad aquí solo es relativa a un registro que es una combinación única: user_id + well_id + deleted = 0 ...

En otras palabras, podría tener múltiples registros donde user_id + well_id + deleted = 1 (valor eliminado es sólo un marcador de borrado)? Ahora, estoy pensando en la definición de que la deleted mp representa "borrados" cuando es > 0, por lo que sólo podía incremento para todos los registros eliminados. Pero pensé que probablemente alguien tiene una mejor idea.

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

Mejor respuesta

2

Usted puede lograr la unicidad con una inmutable criterios que se deleted = 0 en su caso.

Aquí está el ejemplo de la instalación;

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 eliminado
1 usuario1 well1 0
2 usuario1 well1 1
3 usuario1 well1 1
4 usuario2 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 violín aquí

2021-11-20 06:07:04

Sería mejor tener deleted ser un boolean. Pero esta es la solución correcta!
Laurenz Albe

Gracias @Sahap Ascos! Esto es muy útil!
MC Hammerabi

@LaurenzAlbe - de acuerdo booleanos...pero comprimising b/c del dev team preferencias.
MC Hammerabi

"Equipo de desarrolladores preferencias", hmpf. Así que si ellos no saben o no les gusta un tipo de datos, incluso a pesar de que es el adecuado, no se usa?
Laurenz Albe

En otros idiomas

Esta página está en otros idiomas

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