我有两张桌子" 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
。
答案 0 :(得分:4)
唉,这是一个documented缺陷:
<强> 5.8.1。警告强>
继承功能的一个严重限制是索引 (包括唯一约束)和外键约束仅适用 单个表,而不是他们的继承子。这是真的 外键约束的引用和引用方。
- 如果我们将
cities.name
声明为UNIQUE
或PRIMARY KEY
,则不会阻止大写字母表中包含名称的行 复制城市中的行。默认情况下,那些重复的行 显示在来自城市的查询中。事实上,默认情况下,首都会 根本没有唯一约束,因此可能包含多行 同名。您可以为大写添加唯一约束,但是 与城市相比,这不会阻止重复。
因此,您的问题是dona.id
没有唯一约束。我认为您可以在create table语句中声明一个 - 或者之后通过更改表。