아래 예제 테이블 구조는 ERROR를 제공합니다. 참조 테이블에 대해 주어진 키와 일치하는 고유 제한 조건이 없으며 지금까지 응시했지만이 상황 에서이 오류가 발생하는 이유를 알 수 없습니다.
BEGIN;
CREATE TABLE foo (
name VARCHAR(256) PRIMARY KEY
);
CREATE TABLE bar(
pkey SERIAL PRIMARY KEY,
foo_fk VARCHAR(256) NOT NULL REFERENCES foo(name),
name VARCHAR(256) NOT NULL,
UNIQUE (foo_fk,name)
);
CREATE TABLE baz(
pkey SERIAL PRIMARY KEY,
bar_fk VARCHAR(256) NOT NULL REFERENCES bar(name),
name VARCHAR(256)
);
COMMIT;
위의 코드를 실행하면 다음과 같은 오류가 발생하지만 이해가되지 않는 사람은 누구나이 오류가 발생하는 이유를 설명 할 수 있습니다. postgres 9.1을 사용하고 있습니다
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "foo_pkey" for table "foo"
NOTICE: CREATE TABLE will create implicit sequence "bar_pkey_seq" for serial column "bar.pkey"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "bar_pkey" for table "bar"
NOTICE: CREATE TABLE / UNIQUE will create implicit index "bar_foo_fk_name_key" for table "bar"
NOTICE: CREATE TABLE will create implicit sequence "baz_pkey_seq" for serial column "baz.pkey"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "baz_pkey" for table "baz"
ERROR: there is no unique constraint matching given keys for referenced table "bar"
********** Error **********
ERROR: there is no unique constraint matching given keys for referenced table "bar"
SQL state: 42830
답변
테이블 의 name
열에 UNIQUE 제약 조건 bar
이 없기 때문 입니다.
그래서 당신은 2 개 행이 상상 bar
이름을 포함하는 테이블을 'ams'
당신은에 행을 삽입 baz
에 'ams'
에 bar_fk
에있는 행 bar
이 일치하는 두 개의 행이 있기 때문에 참조 할 것?
답변
postgresql에서 모든 외래 키는 부모 테이블 의 고유 키 를 참조해야 하므로 bar
테이블에는 unique (name)
인덱스 가 있어야합니다 .
또한 http://www.postgresql.org/docs/9.1/static/ddl-constraints.html#DDL-CONSTRAINTS-FK를 참조하십시오 .
마지막으로 외래 키는 기본 키이거나 고유 제약 조건 인 열을 참조해야합니다.
강조합니다.
답변
당신이 한 UNIQUE
것처럼 테이블 수준 제약 조건으로 할 때 정의가 복합 기본 키와 약간 비슷한 것은 ddl 제약 조건을 참조하십시오 . 여기에는 추출이 있습니다.
"This specifies that the *combination* of values in the indicated columns is unique across the whole table, though any one of the columns need not be (and ordinarily isn't) unique."
즉, 조합 이 고유하고 외래 키 제약 조건과 일치하지 않으면 두 필드 중 하나에 고유하지 않은 값이있을 수 있습니다 .
제약 조건이 열 수준에 있기를 원할 것입니다. 대신 테이블 수준 제약 조건으로 UNIQUE
정의 name VARCHAR(60) NOT NULL UNIQUE
하거나 열 정의 끝에 ‘추가’ 하거나 각 필드에 대한 개별 테이블 수준 제약 조건을 지정하십시오.
답변
고유 제한 조건으로 이름 열이 있어야합니다. 다음은 문제를 변경하기위한 3 줄의 코드입니다.
-
먼저이 코드를 입력하여 기본 키 제약 조건을 찾으십시오.
\d table_name
당신은 하단에 이와 같이 표시됩니다
"some_constraint" PRIMARY KEY, btree (column)
-
구속 조건을 삭제하십시오.
ALTER TABLE table_name DROP CONSTRAINT some_constraint
-
기존 키 열을 사용하여 새 기본 키 열을 추가하십시오.
ALTER TABLE table_name ADD CONSTRAINT some_constraint PRIMARY KEY(COLUMN_NAME1,COLUMN_NAME2);
그게 다야.