Limite de chave primária composta de apenas um registro como "não eliminados" (onde vários "excluídos" registros de não invocar restrição)

0

Pergunta

Deseja usar uma chave primária composta, de modo a limitar apenas um registro disponível para prod.

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

Proposta de chave primária: (user_id, well_id, deleted)

Exclusividade aqui só é realmente relacionadas com um registo que é uma combinação única: user_id + well_id + deleted = 0 ...

Em outras palavras, pode ter vários registros onde user_id + well_id + deleted = 1 (excluído o valor é apenas um excluído marcador)? Agora, eu estou pensando apenas definir que a deleted marcador representa o "excluído" quando é > 0, então eu poderia apenas de incremento para todos os registros excluídos. Mas eu pensei que alguém provavelmente tem uma idéia melhor.

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

Melhor resposta

2

Você pode alcançar a singularidade com um imutável critérios que é deleted = 0 em seu caso.

Aqui está o exemplo de configuração;

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 excluídos
1 utilizador1 well1 0
2 utilizador1 well1 1
3 utilizador1 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 mexer aqui

2021-11-20 06:07:04

Seria melhor ter deleted ser um boolean. Mas essa é a solução correta!
Laurenz Albe

Obrigado @Sahap Asci! Isto é extremamente útil!
MC Hammerabi

@LaurenzAlbe - acordar boolean...mas comprimising b/c do dev team preferências.
MC Hammerabi

"Equipe de desenvolvedores de preferências", hmpf. Então, se eles não sabem ou não gostam de um tipo de dados, mesmo que ele é o adequado, não é usada?
Laurenz Albe

Em outros idiomas

Esta página está em outros idiomas

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