programing

오류: 참조 테이블 "bar"에 대해 지정된 키와 일치하는 고유 제약 조건이 없습니다.

easyjava 2023. 4. 29. 10:00
반응형

오류: 참조 테이블 "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줄의 코드가 있습니다.

  1. 먼저 이 코드를 입력하여 기본 키 제약 조건을 확인합니다.

    \d table_name
    

    당신은 아래에서 이렇게 보여집니다."some_constraint" PRIMARY KEY, btree (column)

  2. 제약 조건을 삭제합니다.

    ALTER TABLE table_name DROP CONSTRAINT some_constraint
    
  3. 기존 키를 사용하여 새 기본 키 열을 추가합니다.

    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

반응형