오류: 참조 테이블 "bar"에 대해 지정된 키와 일치하는 고유 제약 조건이 없습니다.
Postgres 9.1에서 이 예제 테이블 구조를 생성하려고 합니다.
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)
);
위의 코드를 실행하면 오류가 발생하며, 이는 다음과 같습니다.
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의 란bar테이블에 고유 제약 조건이 없습니다.
그래서 당신이 두 줄을 가지고 있다고 상상해보세요.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 을 참조하십시오.
마지막으로, 외부 키는 기본 키이거나 고유한 제약 조건을 형성하는 열을 참조해야 합니다.
강조해주세요.
고유한 제약 조건으로 이름 열을 사용해야 합니다.여기 당신의 문제를 바꾸기 위한 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);
이상입니다.
할 때는UNIQUE당신이 한 것처럼 테이블 수준 제약 조건으로서 당신이 정의하는 것은 복합 기본 키 시드 제약 조건과 약간 유사합니다, 여기 추출물이 있습니다.
이렇게 하면 표시된 열의 값 조합이 전체 테이블에서 고유하지만 열 중 하나가 고유할 필요는 없으며 일반적으로 고유하지도 않습니다.
이는 조합이 고유하고 외부 키 제약 조건과 일치하지 않는 경우 두 필드 모두 고유하지 않은 값을 가질 수 있음을 의미합니다.
대부분의 경우 제약 조건이 열 수준에 있기를 원하기 때문에 테이블 수준 제약 조건으로 정의하는 것이 좋습니다. '비공식'UNIQUE다음과 같은 열 정의의 끝까지name VARCHAR(60) NOT NULL UNIQUE또는 각 필드에 대한 개별 테이블 수준 제약 조건을 지정합니다.
제 경우에는 기본 키가 아닌 참조된 ID였습니다.
언급URL : https://stackoverflow.com/questions/11966420/error-there-is-no-unique-constraint-matching-given-keys-for-referenced-table-b
'programing' 카테고리의 다른 글
| 아이폰 앱 베타 테스트는 어떻게 하나요? (0) | 2023.04.29 |
|---|---|
| 끌어 당겨서 UITableView 컨트롤러 없이 UITableView 새로 고침 (0) | 2023.04.29 |
| 사용자 컨트롤이 표시될 때 발생하는 이벤트는 무엇입니까? (0) | 2023.04.29 |
| 읽기 전용 속성에서는 양방향 또는 단방향 ToSource 바인딩이 작동할 수 없습니다. (0) | 2023.04.29 |
| 푸시되지 않은 GIT 커밋을 삭제하려면 어떻게 해야 합니까? (0) | 2023.04.29 |