0

다음 필드가 PK 인 테이블에 DB : DOC_ID, SECTION_ID, SET_ID, CELL_ID이 있습니다. 당신이 추론 할 수있는 한, 이것은 엑셀 스프레드 시트의 세트로 참조됩니다.임시 키가 겹치는 여러 레코드 업데이트

필드 외에도 CELL_ROW 필드와 CELL_COL 필드가 있습니다. SET_ID (고유)은 대체 키를 구성합니다.

적어도 이론 상으로는 두 셀의 좌표를 바꾸려면 해당 제약 조건을 해제하거나 세 번째 임시 자유 위치 (예 : A100000)를 사용해야합니다.

가정하자 나는 다음과 같은 세포가 :

DOC_ID | SECTION_ID | SET_ID | CELL_ID | CELL_ROW | CELL_COL 
--------|------------|--------|---------|----------|---------- 
    5 |  456 | 8778 | 15045 | 5  | 4 
    5 |  456 | 8778 | 15048 | 5  | 5 

그리고 나는 기본 테이블에 UPDATE을 수행되는 다음 임시 테이블이 있다고 가정 : 이론적으로

DOC_ID | SECTION_ID | SET_ID | CELL_ID | CELL_ROW | CELL_COL 
--------|------------|--------|---------|----------|---------- 
    5 |  456 | 8778 | 15045 | 5  | 5 
    5 |  456 | 8778 | 15048 | 5  | 4 

UPDATE이해야 그 예외를 발생 시키십시오 ...

하지만 그냥 시도해 봅니다!

당신은 나에게 이유를 설명 할 수 있습니까? 오라클은이를 원자 적 연산으로 수행하기 때문에 제약 조건은 레코드 당 레코드 대신 전체 연산 후에 만 ​​검사됩니까?

이런 상황에서 MS SQL Server 2008 r2 및 Postgres는 어떻게 작동합니까?

답변

1

고유 제한 조건을 연기 한 다음 외래 키로 사용할 수 없다면 PostgreSQL은 오류를 발생시킵니다. SQL Server에 대해 잘 모르겠습니다.

간단히 말하면, 아마도 Postgres 또는 PostgreSQL이라고 할 수 있습니다. 그것을 Postgre라고 부르는 것은 당신이 시정하기 위해 지역 사회와 접촉이 너무 적다는 표시입니다. PostgreSQL의에

더 많은 정보는

PostgreSQL을 검사 튜플 업데이트 시간에 제약을 튜플. 이는 고유 제한 조건을 위반하지 않는 원자 단위로 세트가 갱신되는 경우에도 고유 제한 조건이 위반된다는 것을의 L합니다. 이것은 정수 키에 -1을 곱한 다음 다음 갱신에 -1을 다시 곱하여 하나를 더하는 것과 같은 몇 가지 흥미로운 해결 방법으로 이어진다.

+0

답변 해 주셔서 감사합니다! 사실, 저는 Postgres 커뮤니티와 접촉이 없었습니다. 우리 회사에서는 언급 된 DBMS에 대한 완전한 지원을 제공하지만, 1 년 전에 채용 한 이후 Postgres에 대해 한 번도 다뤄 본 적이 없습니다. – Teejay

+0

SQL Server를 사용해 보았는데 문제없이 작동하는 것 같습니다. 이제, PG의 경우 제약 조건을 변경하고 즉시 DEFERRABLE을 설정하는 방법이 있습니까? 또는이 속성은 테이블 생성시에만 설정할 수 있습니다. 제약 조건은 FK가 아닙니다. – Teejay

+0

문제를 해결하기 위해 DB 작성시 DEFERRABLE로 설정하기로 결정했습니다. – Teejay

1

나는 PostgreSQL을에 그것을 시도 예상대로 중복 키 오류가 발생합니다 : 제약이 deferrable로 설정된 경우

create table t (
    doc_id integer, 
    section_id integer, 
    set_id integer, 
    cell_id integer, 
    cell_row integer, 
    cell_col integer, 
    primary key (doc_id, section_id, set_id, cell_id), 
    unique (set_id, cell_row, cell_col) 
); 

insert into t (doc_id, section_id, set_id, cell_id, cell_row, cell_col) 
values 
(5, 456, 8778, 15045, 5, 4), 
(5, 456, 8778, 15048, 5, 5); 

create temporary table t_temp (
    doc_id integer, 
    section_id integer, 
    set_id integer, 
    cell_id integer, 
    cell_row integer, 
    cell_col integer 
); 

insert into t_temp (doc_id, section_id, set_id, cell_id, cell_row, cell_col) 
values 
(5, 456, 8778, 15045, 5, 5), 
(5, 456, 8778, 15048, 5, 4); 

update t 
set 
    cell_col = t_temp.cell_col 
from t_temp 
where 
    t.doc_id = t_temp.doc_id 
    and t.section_id = t_temp.section_id 
    and t.set_id = t_temp.set_id 
    and t.cell_id = t_temp.cell_id 
; 
ERROR: duplicate key value violates unique constraint "t_set_id_cell_row_cell_col_key" 
DETAIL: Key (set_id, cell_row, cell_col)=(8778, 5, 5) already exists. 

내가 그것을 할 수 있습니다. 해당 키워드에 대한 create table 문을 점검하십시오.

+0

답변 해 주셔서 감사합니다. – Teejay