복붙노트

[SQL] 제약 조건은 DEFERRABLE이 INITIALLY IMMEDIATE 여전히 지연됩니다 정의?

SQL

제약 조건은 DEFERRABLE이 INITIALLY IMMEDIATE 여전히 지연됩니다 정의?

이 답변과 관련하여 내가 설명 할 수없는 현상을 우연히 발견.

버전: GCC-4.4.real에 의해 컴파일 x86_64에-알 - 리눅스 GNU에 PostgreSQL의 9.1.2 (데비안 4.4.5-8) 4.4.5, 64 비트

테스트 베드 :

CREATE TEMP TABLE t (
  id  integer
, txt text
, CONSTRAINT t_pkey PRIMARY KEY (id) DEFERRABLE INITIALLY IMMEDIATE
);

INSERT INTO t VALUES
  (1, 'one')
, (2, 'two');
UPDATE t
SET    id = t_old.id
FROM   t t_old
WHERE (t.id, t_old.id) IN ((1,2), (2,1));

그것은해야하지 예상하지만 위의 UPDATE가 작동합니다. 제약 조건은 IMMEDIATE INITIALLY 정의되고 나는 SET 제약 조건을 사용하지 않았다.

나는 뭔가를 놓치고 또는이 A는 (오히려 해가) 버그가 있습니까?

따라서, 데이터가 너무, CTE의 작품을 수정. 이 지연된하지 PK 실패했지만 :

WITH x AS (UPDATE t SET id = 1 WHERE id = 2)
UPDATE t SET id = 2 WHERE id = 1;

나는 열팽창 계수에 대한 설명서를 인용 :

SET 제약 조건없이, 이것은 UNIQUE 위반 실패 - 예상대로 :

BEGIN;
-- SET CONSTRAINTS t_pkey DEFERRED;
UPDATE t SET id = 2 WHERE txt = 'one';
UPDATE t SET id = 1 WHERE txt = 'two';
COMMIT;

해결법

  1. ==============================

    1.PG9 알파 상태에있을 때 나는 거의 동일한 점을 제기 한 기억. 여기에 톰 레인 (하이 프로파일 PG 핵심 개발자)에서 대답했다 : http://archives.postgresql.org/pgsql-general/2010-01/msg00221.php

    PG9 알파 상태에있을 때 나는 거의 동일한 점을 제기 한 기억. 여기에 톰 레인 (하이 프로파일 PG 핵심 개발자)에서 대답했다 : http://archives.postgresql.org/pgsql-general/2010-01/msg00221.php

    한마디로 : 해결되지 않습니다.

    나는 현재 동작은 버그가 당신의 제안에 동의 말할 수 없습니다. 반대 각도에서 봐 : 그것은 잘못 NOT DEFERRABLE의 동작입니다.

    업데이트의 말에 제약 조건이 만족되기 때문에 사실,이 UPDATE의 제약 조건 위반은 어떤 경우에도 결코 일어나지 않을 것이다. 명령의 끝에 상태가 중요한 것입니다. 단일 명령문의 실행 동안 중간 상태는 사용자에게 노출되어서는 안된다.

    PostgreSQL의 모든 행이 갱신 후 중복 확인하고 근본적으로 결함이 최초의 중복, 즉시 실패하여 비, 연기 제약 조건을 구현하는 것 같다. 그러나 이것은 아마도 PostgreSQL의 오래된로서, 알려진 문제입니다. 현재 이에 대한 해결 방법은 DEFERRABLE 제약 조건을 사용하는 것이 정확하다. 그리고 실패하지 못하기 때문에이 처음부터 실패에 대한 해결책을해야하는데 어떻게 든 동안, 결함으로보고있는 것을 몇 가지 아이러니가있다!

    UNIQUE / PRIMARY KEY 제약의 특별한 치료를합니다. 테이블 만들기에 대한 매뉴얼 페이지를 인용 :

    그것은 비 지연 고유성 제약에서 호환성 섹션에서 더 아래를 주장하는 동안 :

    굵게 강조 광산.

    당신이 열 (들)을 참조하는 모든 FOREIGN KEY 제약 조건이 필요한 경우 DEFERRABLE 때문에 (문서 당) 옵션을 선택하지 않습니다 :

  2. ==============================

    2.이 여기에 약간의 문서 버그 수 있지만, 경우에 당신이 보여주는 것 없습니다. 당신이 트랜잭션을 시작하고 시간에 업데이트 하나를하려고하면, 그들은 실패,하지만 좋은 상태에서 하나의 문 잎 일 경우, 그것은 불평하지 않습니다. 워드 프로세서 말 :

    이 여기에 약간의 문서 버그 수 있지만, 경우에 당신이 보여주는 것 없습니다. 당신이 트랜잭션을 시작하고 시간에 업데이트 하나를하려고하면, 그들은 실패,하지만 좋은 상태에서 하나의 문 잎 일 경우, 그것은 불평하지 않습니다. 워드 프로세서 말 :

    어떤 일이있는 것 같다 정확히 것입니다. 일부 말한다 DEFERRABLE의 문서 주어 나에게 놀람은 무엇입니까 :

    연기 INITIALLY IMMEDIATE 옵션이 없다면, 예를 업데이트 심지어 UPDATE 문 불구하고 좋은 상태의 잎 것들 (아마도 "명령"을 구성), 실패합니다. 아마도 문서는 각 행은 문에 의해 수정 같은 NOT DEFERRABLE 제약 조건이 적용됩니다 말을 수정해야?

  3. from https://stackoverflow.com/questions/10032272/constraint-defined-deferrable-initially-immediate-is-still-deferred by cc-by-sa and MIT license