> 데이터 베이스 > MySQL 튜토리얼 > 내 Postgres 9.1 외래 키 참조가 '고유 제약 조건' 오류로 인해 실패하는 이유는 무엇입니까?

내 Postgres 9.1 외래 키 참조가 '고유 제약 조건' 오류로 인해 실패하는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2025-01-08 22:22:45
원래의
684명이 탐색했습니다.

Why Does My Postgres 9.1 Foreign Key Reference Fail with a

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿