MATCH FULL, MATCH SIMPLE 및 MATCH PARTIAL의 차이점은 무엇입니까?


답변:


38

CREATE TABLE매뉴얼 페이지를 확인하십시오 .

검색 유형 MATCH FULL에는 MATCH PARTIAL, 및 MATCH SIMPLE (기본값)이 있습니다. MATCH FULL모든 외래 키 열이 null이 아니면 다중 열 외래 키의 한 열이 null이 될 수 없습니다. 모두 널인 경우 행은 참조 된 테이블에서 일치하지 않아도됩니다. MATCH SIMPLE외래 키 열 중 하나가 null 일 수 있습니다. 이들 중 하나가 널이면 행이 참조 된 테이블에서 일치하지 않아도됩니다. MATCH PARTIAL아직 구현되지 않았습니다. 물론 NOT NULL이러한 사례가 발생하지 않도록 참조 열에 제약 조건을 적용 할 수 있습니다.

또한 외래 키 에 관한 장에서 :

일반적으로 참조 행이 참조 열이 null 인 경우 참조 행은 외래 키 제약 조건을 충족 할 필요가 없습니다. MATCH FULL 외래 키 선언에 추가 된 경우 참조 행은 모든 참조 열이 null 인 경우에만 제약 조건을 만족시키는 이스케이프됩니다 (따라서 null 값과 null이 아닌 값의 혼합으로 인해 MATCH FULL 제약 조건 이 실패 함 ). 참조 행이 외래 키 제약 조건을 충족시키지 못하도록하려면 참조 열을로 선언하십시오 NOT NULL.

현재 설명서 또는 설치와 일치하는 버전 을 참조하십시오 . 오래된 Google 링크는 오래된 버전으로 연결되지 않습니다.


7

FULLvs SIMPLEvsPARTIAL

선택한 답변은 정확하지만 이것이 새로운 것이면 코드와 함께보고 싶을 수도 있습니다. 그러면 더 쉬운 방법이라고 생각합니다.

-- one row with (1,1)
CREATE TABLE foo ( a int, b int,
  PRIMARY KEY (a,b)
);
INSERT INTO foo (a,b) VALUES (1,1);

--
-- two child tables to reference it
-- 
CREATE TABLE t_full ( a int, b int,
  FOREIGN KEY (a,b) REFERENCES foo MATCH FULL
);
CREATE TABLE t_simple ( a int, b int,
  FOREIGN KEY (a,b) REFERENCES foo MATCH SIMPLE
);

논리적으로 FULLand를 사용 SIMPLE하면 전체 일치 항목을 삽입 할 수 있습니다.

-- works
INSERT INTO t_full (a,b) VALUES (1,1);
INSERT INTO t_simple (a,b) VALUES (1,1);

열 중 하나가이면 문제가 발생 NULL합니다.

-- works
INSERT INTO t_simple (a,b) VALUES (1,NULL);

-- fails
INSERT INTO t_full (a,b) VALUES (1,NULL);

에 삽입 t_full하면 다음과 같은 오류가 발생합니다.

ERROR:  insert or update on table "t_full" violates foreign key constraint "t_full_a_fkey"
DETAIL:  MATCH FULL does not allow mixing of null and nonnull key values.
INSERT 0 1

자, 어떻습니까 (42,NULL)? 이것은 제가 항상 혼란스럽게 생각했던 부분입니다 MATCH SIMPLE.

-- works
INSERT INTO t_simple (a,b) VALUES (42,NULL);

위의 동작은 것입니다 NOT 작업은 구현되지 않은과 MATCH PARTIAL가능성이 가장 오른쪽 열이되는 복합 인덱스 원하는 것을하는, NULL밖으로 에드. 그러나 일부 사람들은 판도라의 상자를 나쁜 디자인으로 여는 방법으로 생각합니다.

간단한 정의 및 니모닉

  • MATCH FULL모든 것이 완전히 일치 해야 하거나 모든 열이NULL
  • MATCH SIMPLE하나 NULL의 제약 조건 이라면 단순히 무시됩니다.
  • MATCH PARTIAL한 가지가 제약 조건의 목적에 알맞은 NULL것을 수행함으로써 모든 NULL것이 부분적으로 구제되는 것은 아니라는 사실입니다 .

SQL 사양 노트

후손을 위해 다음은 SQL 사양의 정의입니다. <match type>

  • MATCH SIMPLE하나 이상의 참조 열이 null이면 참조 테이블의 행이 제약 조건 검사를 통과합니다. 모든 참조 열이 널이 아닌 경우, 참조 테이블의 모든 참조 열과 일치하는 행이있는 경우에만 행이 제한 조건 검사를 통과합니다.
  • MATCH PARTIAL: 모든 참조 컬럼이 널인 경우 참조 테이블의 행이 제한 조건 검사를 통과합니다. 하나 이상의 참조 컬럼이 널이 아닌 경우, 모든 널이 아닌 참조 컬럼과 일치하는 참조 테이블의 행이있는 경우에만 행이 제한 조건 검사를 통과합니다.
  • MATCH FULL: 모든 참조 컬럼이 널인 경우 참조 테이블의 행이 제한 조건 검사를 통과합니다. 모든 참조 열이 널이 아닌 경우, 참조 테이블의 모든 참조 열과 일치하는 행이있는 경우에만 행이 제한 조건 검사를 통과합니다. 일부 참조 열이 널이고 다른 참조 열이 널이 아닌 경우, 참조 테이블의 행이 제한 조건 점검을 위반합니다.

이것은 PostgreSQL과 관련이 없지만 PostgreSQL로 이러한 예제를 보여줍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.