답변:
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 링크는 오래된 버전으로 연결되지 않습니다.
FULL
vs SIMPLE
vsPARTIAL
선택한 답변은 정확하지만 이것이 새로운 것이면 코드와 함께보고 싶을 수도 있습니다. 그러면 더 쉬운 방법이라고 생각합니다.
-- 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
);
논리적으로 FULL
and를 사용 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 사양의 정의입니다. <match type>
MATCH SIMPLE
하나 이상의 참조 열이 null이면 참조 테이블의 행이 제약 조건 검사를 통과합니다. 모든 참조 열이 널이 아닌 경우, 참조 테이블의 모든 참조 열과 일치하는 행이있는 경우에만 행이 제한 조건 검사를 통과합니다.MATCH PARTIAL
: 모든 참조 컬럼이 널인 경우 참조 테이블의 행이 제한 조건 검사를 통과합니다. 하나 이상의 참조 컬럼이 널이 아닌 경우, 모든 널이 아닌 참조 컬럼과 일치하는 참조 테이블의 행이있는 경우에만 행이 제한 조건 검사를 통과합니다.MATCH FULL
: 모든 참조 컬럼이 널인 경우 참조 테이블의 행이 제한 조건 검사를 통과합니다. 모든 참조 열이 널이 아닌 경우, 참조 테이블의 모든 참조 열과 일치하는 행이있는 경우에만 행이 제한 조건 검사를 통과합니다. 일부 참조 열이 널이고 다른 참조 열이 널이 아닌 경우, 참조 테이블의 행이 제한 조건 점검을 위반합니다.
이것은 PostgreSQL과 관련이 없지만 PostgreSQL로 이러한 예제를 보여줍니다.