제한 복합 기본 키 하나에만 기록되지 않음"으로 삭제"(여기서 여러 삭제되지 않는 레코드를 호출하는 제약 조건)

0

질문

원하는 사용하기 복합 기본 키로를 제한 하나의 레코드만 사용할 수 있 prod.

테이블: user_id text, well_id text, deleted int, [other attributes]

제안된 기본 키: (user_id, well_id, deleted)

성 여기에는 정말로 관련이 있는 레코드입니다 독특한 조합은: user_id + well_id + deleted = 0 ...

다시 말해서,수있는 여러 레코드 user_id + well_id + deleted = 1 (삭제된 값은 단지 삭제 표식)? 지금,나는 생각의 정의는 deleted 마커를 나타내는"삭제"때>0,그렇게 할 수 있는 증가 삭제되는 모든 기록입니다. 그러나 내가 생각하는 사람은 아마 더 나은 생각이 아니다.

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

최고의 응답

2

을 달성할 수 있는 유일성으로 변경할 수 없는 조건 deleted = 0 귀하의 경우에.

여기에는 샘플 설정

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 삭제
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 바이올린 여기에서

2021-11-20 06:07:04

더 나은 것을 가질 deletedboolean. 하지만 이것은 올바른 해결책입니다!
Laurenz Albe

감사@Sahap Asci! 이것은 매우 도움이 된다!
MC Hammerabi

@LaurenzAlbe-에 동의 boolean...하지만 comprimising b/c 의 개발팀 기본 설정.
MC Hammerabi

"개발자 환경 설정",hmpf. 그래서 그들은하지 않으면 알고 또 좋아하지 않는 데이터 입력,비록 그것을 적절한 하나의 즐거움을 주는 비교할 수 없는 사용됩니까?
Laurenz Albe

다른 언어로

이 페이지는 다른 언어로되어 있습니다

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