当前位置: 首页 > 知识库问答 >
问题:

错误:没有唯一约束匹配引用表“bar”的给定键

邢乐
2023-03-14

试图在Postgres 9.1中创建此示例表结构:

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 (foo_fk,name)
);

CREATE TABLE baz(   
    pkey        SERIAL PRIMARY KEY,
    bar_fk      VARCHAR(256) NOT NULL REFERENCES bar(name),
    name        VARCHAR(256)
);

运行上述代码会产生一个错误,这对我来说没有意义:

NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "foo_pkey" for table "foo"
NOTICE:  CREATE TABLE will create implicit sequence "bar_pkey_seq" for serial column "bar.pkey"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "bar_pkey" for table "bar"
NOTICE:  CREATE TABLE / UNIQUE will create implicit index "bar_foo_fk_name_key" for table "bar"
NOTICE:  CREATE TABLE will create implicit sequence "baz_pkey_seq" for serial column "baz.pkey"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "baz_pkey" for table "baz"
ERROR:  there is no unique constraint matching given keys for referenced table "bar"
********** Error **********

ERROR: there is no unique constraint matching given keys for referenced table "bar"
SQL state: 42830

有人能解释为什么会出现这种错误吗?

共有3个答案

帅煌
2023-03-14

您应该将“名称”列作为唯一约束。这里有3行代码来改变你的问题

>

  • 首先通过键入以下代码找出主键约束

    \d table_name
    

    在底部的“some_constraint”主键btree(column)

    删除约束:

    ALTER TABLE table_name DROP CONSTRAINT some_constraint
    

    使用现有主键列添加新的主键列:

    ALTER TABLE table_name ADD CONSTRAINT some_constraint PRIMARY KEY(COLUMN_NAME1,COLUMN_NAME2);
    

    这就是全部。

  • 杜浩壤
    2023-03-14

    在postgresql中,所有外键都必须引用父表中的唯一键,因此在bar表中必须有unique(name)索引。

    另见http://www.postgresql.org/docs/9.1/static/ddl-constraints.html#DDL-CONSTRAINTS-FK具体如下:

    最后,我们应该提到外键必须引用作为主键或形成唯一约束的列。

    我的。

    宰宣
    2023-03-14

    这是因为bar表上的name列没有唯一约束。

    因此,假设您在bar表上有两行,其中包含名称'ams',并且您在baz上插入一行,其中'ams'位于bar_fk上,由于有两行匹配,它会指的是bar上的哪一行?

     类似资料:
    • 我正在为班级注册建立一个数据库,但我在“注册”表上遇到了问题。我需要将分区中的所有主键传递到注册中,但我还想传递一个附加键(“sectionNumber”)。然而,我不想让“sectionNumber”成为“Sections”主键的一部分,因为我不想将sectionNumber传递到每个我有外键的表中,这些外键来自“Sections”有人对如何解决这个问题有什么建议吗?我一直得到下面的错误。

    • 问题内容: 我有一个表定义: 我正在尝试创建失败的表 错误是: 我不确定如何解决此问题。 问题答案: 我认为您正在寻找两个单独的外键:

    • 我试着用这些代码使用postgresql创建表,但人们一直说,并没有唯一的约束匹配引用表的给定键。当我试图创建表、节和评估时,出现了这个消息。 请帮帮我。 )我更改了create语句的顺序,并在表中添加了unique key,但仍然不起作用。

    • 我在创建一个包含外键的表时遇到问题,该外键来自另一个包含两个主键的表。 以下是表格: 无法创建表risk_final并给我错误: 错误:没有唯一的约束匹配引用表"names_types"的给定键 我该怎么解决呢?

    • PostgreSQL/PGAdmin4错误:没有唯一的约束匹配引用表的给定键 这是我试图编码到PGAdmin4/Postgresql:http://i.imgur.com/xPEu8Sh.jpg的模式 我能够转换所有表格,除了“资格证书”。 我尝试处理以下查询: 我收到以下消息:错误:没有唯一的约束匹配引用表“section”的给定键 这些是我在表格部分中介绍的外国和主要内容 普凯:我,伊姆格。c

    • 所以我得到了一个错误,没有唯一的约束匹配我的一个表的给定键。我有两个表:用户和项目,其中我们有一个多对一的关系(一个用户有多个项目)。我用炼金术来做这一切: 要创建表,我在我的应用程序中有以下语句。py': 错误是:没有唯一的约束匹配引用表用户的给定键。 我不确定哪里出错了,因为我在ItemModel中有一个外键与UserModel中的主键匹配。欢迎任何建议/提示! 谢谢