删除唯一约束 - PostgreSQL

时间:2018-06-10 07:46:44

标签: postgresql sqlalchemy relational-database

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

1 个答案:

答案 0 :(得分:1)

  

我正在寻求明确这一点:FOREIGN KEY在另一方需要一个独特的约束吗

不,它不仅仅需要UNIQUE CONSTRAINT。它可以是PRIMARY KEYUNIQUE 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