TL;博士
我想澄清这一点:aFOREIGN KEY
是否需要另一方面的aUNIQUE CONSTRAINT
,特别是在Postgres中,通常在关系数据库系统中?
也许,我可以测试这个,但是我会问,如果UNIQUE CONSTRAINT
需要FOREIGN KEY
如果我不创建它会发生什么?数据库会创建一个还是抛出一个错误?
我是怎么到那里的
早些时候,我创建了一个带有列username
的表,在该表上施加了一个惟一的约束。然后,我创建了另一个表,其中一列bearer_name
有一个FOREIGN KEY
引用上一个表的列username
;另一个表有一个UNIQUE CONSTRAINT
。
现在,我想从数据库中删除UNIQUE CONSTRAINT
列上的username
,因为我后来在同一列上创建了一个UNIQUE INDEX
,直觉上我觉得它们有相同的用途,或者不是吗?但是数据库抱怨UNIQUE INDEX
有一些依赖对象,所以不能删除它,除非我提供CASCADE
作为一个选项,以便甚至删除依赖对象。它将第二个表中的FOREIGN KEY
onbearer_name
列标识为依赖对象。
是否可以将FOREIGN KEY
指向UNIQUE INDEX
而不是UNIQUE CONSTRAINT
?
最佳答案
我想澄清的是:外键是否需要在另一边有一个唯一的约束
不,它不仅需要UNIQUE CONSTRAINT
。它可以是PRIMARY KEY
或UNIQUE INDEX
。
也许,我可以测试这个,但是我会问,如果外键需要唯一的约束,如果我不创建它会发生什么?数据库会创建一个还是抛出一个错误?
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
外键是否可能是指向唯一索引的点,而不是唯一约束?
是的,这是可能的。
CREATE UNIQUE INDEX tab_b_i ON tab_b(b_id);
DBFiddle Demo2
关于postgresql - 删除唯一约束-PostgreSQL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50781584/