首頁 >資料庫 >mysql教程 >為什麼我的 Postgres 9.1 外鍵引用失敗並出現「唯一約束」錯誤?

為什麼我的 Postgres 9.1 外鍵引用失敗並出現「唯一約束」錯誤?

Patricia Arquette
Patricia Arquette原創
2025-01-08 22:22:45787瀏覽

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_fk列定義為引用foo(name)的外鍵。然而,錯誤訊息卻抱怨bar表中所引用的name列缺少唯一約束。

為了理解這個問題,考慮bar表中多行共享相同name值的場景,如下例所示:

<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無法確定bar表中哪一行應該被外鍵引用。

解決方法是在bar表中強制name列的唯一性。透過為name列新增唯一約束,我們確保bar表中的每一行都具有不同的name值,從而消除歧義,並允許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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn