解決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中文網其他相關文章!