PostgreSQL 9.1 외래 키 참조의 "해결되지 않은 고유 제약 조건" 오류 해결
PostgreSQL 9.1에서 외래 키 참조가 포함된 테이블 구조를 생성할 때 예기치 않은 오류가 발생할 수 있습니다. 이 오류는 일관되지 않은 제약 조건 구성으로 인해 발생합니다.
문제의 SQL 코드에는 foo, bar, baz라는 세 개의 테이블을 생성하는 작업이 포함되어 있습니다. foo 테이블은 name 열에 기본 키를 가지고 있는 반면, bar 테이블은 foo(name)을 참조하는 외래 키로 foo_fk 열을 정의합니다. 그러나 오류 메시지는 막대 테이블에서 참조된 이름 열에 고유 제약 조건이 없다고 불평합니다.
이 문제를 이해하려면 다음 예와 같이 막대 테이블의 여러 행이 동일한 이름 값을 공유하는 시나리오를 고려해 보세요.
<code class="language-sql">INSERT INTO bar (foo_fk, name) VALUES ('alice', 'ams'); INSERT INTO bar (foo_fk, name) VALUES ('bob', 'ams');</code>
이제 baz 테이블에 행을 삽입하고 bar 테이블에서 모호한 ams 값을 참조하려고 하면 PostgreSQL은 대상 행을 고유하게 식별할 수 없습니다. 이러한 모호성은 PostgreSQL이 외래 키가 참조해야 하는 바 테이블의 행을 결정할 수 없기 때문에 발생합니다.
해결책은 막대 테이블에서 이름 열의 고유성을 강화하는 것입니다. 이름 열에 고유 제약 조건을 추가하면 막대 테이블의 각 행이 서로 다른 이름 값을 갖도록 하여 모호성을 제거하고 PostgreSQL이 참조된 행을 고유하게 식별할 수 있습니다.
필수 제약 조건을 포함하여 수정된 SQL 코드는 다음과 같습니다.
<code class="language-sql">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 (name) -- 添加唯一约束 ); CREATE TABLE baz( pkey SERIAL PRIMARY KEY, bar_fk VARCHAR(256) NOT NULL REFERENCES bar(name), name VARCHAR(256) );</code>
이 고유 제약 조건을 통해 PostgreSQL은 이제 테이블 구조를 성공적으로 생성할 수 있으며 "주어진 키와 일치하는 고유 제약 조건이 없습니다" 오류를 방지할 수 있습니다.
위 내용은 내 Postgres 9.1 외래 키 참조가 '고유 제약 조건' 오류로 인해 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!