首页 > 解决方案 > 当您在 Oracle 中删除附加了外键的主键约束然后重新启用主键时会发生什么?

问题描述

好吧,假设您有 2 张桌子,Table1并且Table2.

Table1的主键是外键Table2。如果您删除主键约束Table1,然后使用命令重新启用它,Alter TableTable2 上的外键是否也会自动重新启用?

标签: sqloracleoracle12c

解决方案


让我们试试会发生什么。

首先创建表 t1 和 t2。

CREATE TABLE t1 (parent_id NUMBER);
Table created
CREATE TABLE t2 (child_id NUMBER);
Table created

然后创建2个约束

ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY (parent_id) USING INDEX;
Table altered
ALTER TABLE t2 ADD CONSTRAINT t2_fk FOREIGN KEY (child_id) REFERENCES t1;
Table altered

现在查看字典并选择 2 个表的约束

SELECT c.CONSTRAINT_NAME, c.CONSTRAINT_TYPE, c.R_CONSTRAINT_NAME
FROM User_Constraints c WHERE c.TABLE_NAME IN ('T1', 'T2');
CONSTRAINT_NAME                CONSTRAINT_TYPE R_CONSTRAINT_NAME
------------------------------ --------------- ------------------------------
T1_PK                          P               
T2_FK                          R               T1_PK

我们看到 1 个主键 (P) 和 1 个外键 (R) 然后删除 pk

ALTER TABLE t1 DROP CONSTRAINT t1_pk CASCADE;
Table altered

cascade 关键字指示 oracle 隐式删除所有引用要删除的 pk 的 fk 约束。如果没有级联,您将得到ORA-02273:此唯一/主键被一些外键引用,并且 pk 不会被删除。

再次查看字典并选择2个表的约束

SELECT c.CONSTRAINT_NAME, c.CONSTRAINT_TYPE, c.R_CONSTRAINT_NAME
FROM User_Constraints c WHERE c.TABLE_NAME IN ('T1', 'T2');
CONSTRAINT_NAME                CONSTRAINT_TYPE R_CONSTRAINT_NAME
------------------------------ --------------- ------------------------------

没有行 - pk 和 fk 消失了。重新创建pk

ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY (parent_id) USING INDEX;
Table altered

看看字典

SELECT c.CONSTRAINT_NAME, c.CONSTRAINT_TYPE, c.R_CONSTRAINT_NAME
FROM User_Constraints c WHERE c.TABLE_NAME IN ('T1', 'T2');
CONSTRAINT_NAME                CONSTRAINT_TYPE R_CONSTRAINT_NAME
------------------------------ --------------- ------------------------------
T1_PK                          P               

仅创建 pk。清理测试用例

DROP TABLE t2;
Table dropped
DROP TABLE t1;
Table dropped

推荐阅读