【问题标题】:Postgresql ERROR: there is no unique constraint matching given keys for referenced tablePostgresql 错误:没有唯一约束匹配引用表的给定键
【发布时间】:2015-04-18 00:44:43
【问题描述】:

我有两个表“Persona”(人)和“Dona”(女),我想更改第三个名为“Baptisme”(洗礼)的表,但我遇到了一些问题。

这些是我的桌子:

CREATE TABLE baptismes.Persona (
    id SERIAL PRIMARY KEY,
    nom VARCHAR(255),
    nom_complementari1 VARCHAR(255),
    nom_complementari2 VARCHAR(255),
    nom_complementari3 VARCHAR(255),
    nom_complementari4 VARCHAR(255),
    cognom1 VARCHAR(255),
    cognom2 VARCHAR(255),
    lloc_naixement VARCHAR(255) REFERENCES baptismes.Poblacio(nom),
    data_naixement baptismes.Data,
    alies VARCHAR(255),
    sexe CHAR(1),
    difunt BOOLEAN
);

CREATE TABLE baptismes.Dona (
    cognom_marit_actual VARCHAR(255),
    cognom_marit_anterior VARCHAR(255)
) INHERITS (baptismes.Persona);

CREATE TABLE baptismes.Baptisme (
    id SERIAL PRIMARY KEY,
    ...
);

Baptisme 有更多属性,但它们在这里无关紧要。

我想做的是:

ALTER TABLE baptismes.baptisme
ADD COLUMN mare INTEGER REFERENCES baptismes.Dona(id);

但这给了我以下错误:

ERROR:  no hay restricción unique que coincida con las columnas dadas en la tabla referida «dona»
********** Error **********

ERROR: no hay restricción unique que coincida con las columnas dadas en la tabla referida «dona»
SQL state: 42830

英文:“没有唯一约束匹配给定键的引用表”。

我无法理解,因为 Dona 从 Persona (id) 获取 PK,所以应该是 UNIQUE

有人可以帮帮我吗?谢谢!

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    唉,这是documented 的不足:

    5.8.1。注意事项

    继承特性的一个严重限制是索引 (包括唯一约束)和外键约束仅适用 到单个表,而不是它们的继承子表。这是真的 外键约束的引用侧和被引用侧。

    • 如果我们将cities.name 声明为UNIQUEPRIMARY KEY,这不会阻止capitals 表包含带有名称的行 在城市中重复行。默认情况下,那些重复的行 出现在来自城市的查询中。事实上,默认情况下,大写字母会 根本没有唯一约束,因此可以包含多行 同名。您可以为大写字母添加唯一约束,但是 与城市相比,这不会防止重复。

    所以,您的问题是 dona.id 没有唯一约束。我认为您可以在 create table 语句中声明一个 - 或者在之后更改表。

    【讨论】:

    • 但是,如果我在Dona 表中声明一个,例如,我可以有一个 id = 10 的dona 和一个具有相同 id = 10 的person。不是吗?他们不会是同一个人。
    • @Lyd 。 . .是的,这正是文档中的“警告”之一。
    猜你喜欢
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 2012-08-11
    • 2021-06-24
    • 2014-12-23
    相关资源
    最近更新 更多