TL; DR
我正在寻求明确这一点:FOREIGN KEY
是否需要另一方UNIQUE CONSTRAINT
,特别是在Postgres中,一般来说,在关系数据库系统中?
也许,我可以对此进行测试,但我会问,UNIQUE CONSTRAINT
是否需要FOREIGN KEY
如果我不创建会发生什么?数据库会创建一个还是会抛出错误?
我是如何到达那里的
我之前创建了一个带有username
列的表,我在其中强加了一个唯一约束。然后,我创建了另一个包含bearer_name
列的表格,其中FOREIGN KEY
引用了上一个表格的列username
;那个有UNIQUE CONSTRAINT
的人。
现在,我想从数据库中删除UNIQUE CONSTRAINT
列上的username
,因为我后来在同一列上创建了UNIQUE INDEX
,直觉上我觉得它们服务于同样的目的,还是不是他们?但是数据库抱怨UNIQUE INDEX
有一些依赖对象,因此除非我提供CASCADE
作为选项以便删除依赖对象,否则它不会被删除。它将第二个表中的FOREIGN KEY
bearer_name
列标识为从属对象。
FOREIGN KEY
是否有可能指向UNIQUE INDEX
而不是UNIQUE CONSTRAINT
?
答案 0 :(得分:1)
我正在寻求明确这一点:FOREIGN KEY在另一方需要一个独特的约束吗
不,它不仅仅需要UNIQUE CONSTRAINT
。它可以是PRIMARY KEY
或UNIQUE INDEX
。
也许,我可以测试一下,但我会问,如果FOREIGN KEY需要UNIQUE CONSTRAINT,如果我不创建它会发生什么? 数据库会创建一个还是会抛出错误?
CREATE TABLE tab_a(a_id INT, b_id INT);
CREATE TABLE tab_b(b_id INT);
ALTER TABLE tab_a ADD CONSTRAINT fk_tab_a_tab_b FOREIGN KEY (b_id)
REFERENCES tab_b(b_id);
ERROR: there is no unique constraint matching given keys
for referenced table "tab_b"
<强> DBFiddle Demo 强>
FOREIGN KEY是否可以指向UNIQUE INDEX而不是UNIQUE CONSTRAINT?
是的,这是可能的。
CREATE UNIQUE INDEX tab_b_i ON tab_b(b_id);
<强> DBFiddle Demo2 强>