복붙노트

[SQL] INITIALLY DEFERRABLE IMMEDIATE 대 NOT DEFERRABLE

SQL

INITIALLY DEFERRABLE IMMEDIATE 대 NOT DEFERRABLE

완전한 도서 - 나는 데이터베이스 시스템에서 SQL 키워드 DEFERRABLE에 대해 숙지.

어떻게 INITIALLY DEFERRABLE IMMEDIATE에서 DEFERRABLE 다른 아닌가요? 두 경우 모두, 보인다, 어떤 제약 조건은 각 문 다음에 확인됩니다.

해결법

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

    1.당신이 그것을 필요로 할 때 DEFERRABLE INITIALLY IMMEDIATE를 사용하면 필요에 따라 제약을 지연시킬 수 있습니다.

    당신이 그것을 필요로 할 때 DEFERRABLE INITIALLY IMMEDIATE를 사용하면 필요에 따라 제약을 지연시킬 수 있습니다.

    이것은 일반적으로 문 시간에 제약을 확인하려는 경우 유용하지만, 예를 들어,에 대한 배치로드 시간이 커밋 될 때까지 검사를 연기하고 싶다.

    제약을 연기하는 방법 구문은 비록 다양한 DBMS 다릅니다.

    NOT DEFERRABLE하면 지금까지 시간을 커밋 할 때까지 검사를 연기 할 수 없을 것입니다.

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

    2.이외에도 다른 (정확한) 답변에서 PostgreSQL을의 말할 때, 그것은 것을 주장해야한다 :

    이외에도 다른 (정확한) 답변에서 PostgreSQL을의 말할 때, 그것은 것을 주장해야한다 :

    그래서이 IMMEDIATE로 설정된 경우 DEFERRABLE 제약 조건은 DEFERRABLE NOT 하나 같은 역할을 말할 올바른 아니다.

    의이 차이에 정교한 보자 :

    CREATE TABLE example(
        row integer NOT NULL,
        col integer NOT NULL,
        UNIQUE (row, col) DEFERRABLE INITIALLY IMMEDIATE
    );
    
    INSERT INTO example (row, col) VALUES (1,1),(2,2),(3,3);
    
    UPDATE example SET row = row + 1, col = col + 1;
    
    SELECT * FROM example;
    

    이 올바르게 출력 :

    그러나 우리는 IMMEDIATE 명령 INITIALLY 연기를 제거하는 경우,

    부 칙 (2017년 10월 12일)

    이 동작은 참으로 섹션의 "호환성"여기에 설명되어 있습니다 :

  3. ==============================

    3.이외에도 연기 할 수 있다는 명백한에서의 차이는 실제 성능이다. 모든 제약 조건은 단순히 연기 될 것 - 성능 저하가 아니었다 경우, 필요, 연기 여부를 선택할 수있는 옵션이없는 것으로있을 것입니다.

    이외에도 연기 할 수 있다는 명백한에서의 차이는 실제 성능이다. 모든 제약 조건은 단순히 연기 될 것 - 성능 저하가 아니었다 경우, 필요, 연기 여부를 선택할 수있는 옵션이없는 것으로있을 것입니다.

    성능 저하는 데이터베이스가 데이터를 제한하는 방법에 대한 지식을 주어진 수행 할 수있는 최적화과 관련이있다. 일시적으로 허용 중복이 허용되어야하기 때문에 제약이, 연기의 경우 예를 들어, 오라클의 고유 제한 조건을 다시 생성되는 인덱스는 고유 인덱스가 될 수 없습니다. 제약 조건, 연기없는 경우에는 다음 인덱스는 고유 할 수 있습니다.

  4. ==============================

    4.나는 매우 늦게 파티에있어하지만 난 그를 추가하고 싶었 - 년 12 월 2018로 -이 표준 SQL 기능의 구현 일정 수준의 서비스가 제공됩니다 (더있을 수 있습니다) 알고 두 데이터베이스를 :

    나는 매우 늦게 파티에있어하지만 난 그를 추가하고 싶었 - 년 12 월 2018로 -이 표준 SQL 기능의 구현 일정 수준의 서비스가 제공됩니다 (더있을 수 있습니다) 알고 두 데이터베이스를 :

    Database    NOT DEFERRABLE  DEFERRABLE           DEFERRABLE 
                                INITIALLY IMMEDIATE  INITIALLY DEFERRED
    ----------  --------------  -------------------  ------------------
    Oracle      N/A *1          Yes (default)        Yes
    PostgreSQL  Yes (default)   Yes                  Yes
    DB2         -               -                    -
    SQL Server  -               -                    -
    MySQL       -               -                    -
    MariaDB     -               -                    -
    SAP Sybase  -               -                    -
    HyperSQL    -               -                    -
    H2          -               -                    -
    Derby       -               -                    -
    

    * 1 오라클 12C는 NOT DEFERRABLE 제약 상태를 받아 들인다하더라도, 실제로이를 무시하고 INITIALLY DEFERRABLE로 즉시 작동합니다.

    보시다시피, 오라클은 첫 번째 유형 (NOT DEFERRABLE), 오라클 (이 경우 OP)를 사용하여 개발자가 혼란을 얻을 수 있습니다 이유의를 구현하고 처음 두 종류의 동등한 고려하지 않습니다.

    흥미롭게도 Oracle과 PostgreSQL은 다른 기본 유형이있다. 아마 성능에 영향이 있습니다.

  5. ==============================

    5.DEFERRABLE NOT - (. 즉 직접 삽입 문 후)는 제약 조건 검사를 변경할 수 없습니다, 각 문 후 오라클 검사를.

    DEFERRABLE NOT - (. 즉 직접 삽입 문 후)는 제약 조건 검사를 변경할 수 없습니다, 각 문 후 오라클 검사를.

    DEFERRABLE는 INITIALLY IMMEDIATE - 오라클 검사는 각 문 다음에 제약 조건. (. 즉 후 커밋)하지만, 당신은 각 거래 후으로 변경할 수 있습니다 :

    set constraint pk_tab1 deferred;
    
  6. from https://stackoverflow.com/questions/5300307/not-deferrable-versus-deferrable-initially-immediate by cc-by-sa and MIT license