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

时间:2015-04-17 16:22:24

标签: sql postgresql

我有两张桌子" Persona" (人)和"多纳" (女)我想改变第三个名为" 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

是的,有人可以帮助我吗?谢谢!

1 个答案:

答案 0 :(得分:4)

唉,这是一个documented缺陷:

  

<强> 5.8.1。警告

     

继承功能的一个严重限制是索引   (包括唯一约束)和外键约束仅适用   单个表,而不是他们的继承子。这是真的   外键约束的引用和引用方。

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

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