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

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

Patricia Arquette
发布: 2025-01-08 22:22:45
原创
782 人浏览过

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值的场景,如下例所示:

INSERT INTO bar (foo_fk, name) VALUES ('alice', 'ams');
INSERT INTO bar (foo_fk, name) VALUES ('bob', 'ams');
登录后复制

现在,如果我们尝试插入一行到baz表中,并引用bar表中不明确的ams值,PostgreSQL将无法唯一地识别目标行。这种歧义的出现是因为PostgreSQL无法确定bar表中哪一行应该被外键引用。

解决方法是在bar表中强制name列的唯一性。通过向name列添加唯一约束,我们确保bar表中的每一行都具有不同的name值,从而消除歧义,并允许PostgreSQL唯一地识别被引用的行。

包含必要约束的已更正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)
);
登录后复制

有了这个唯一约束,PostgreSQL现在可以成功创建表结构,并避免“没有与给定键匹配的唯一约束”错误。

以上是为什么我的 Postgres 9.1 外键引用失败并出现'唯一约束”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板