首页 >数据库 >mysql教程 >为什么我的 Postgres 9.1 外键引用失败并出现'唯一约束”错误?

为什么我的 Postgres 9.1 外键引用失败并出现'唯一约束”错误?

Patricia Arquette
Patricia Arquette原创
2025-01-08 22:22:45689浏览

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