sql - 当您在 Oracle 中删除附加了外键的主键约束然后重新启用主键时会发生什么?
问题描述
好吧,假设您有 2 张桌子,Table1
并且Table2
.
Table1
的主键是外键Table2
。如果您删除主键约束Table1
,然后使用命令重新启用它,Alter Table
Table2 上的外键是否也会自动重新启用?
解决方案
让我们试试会发生什么。
首先创建表 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
推荐阅读
- javascript - 从另一个数组中的数组中查找值,然后匹配第二个值 Google Apps Script Javascript JSON API
- docker - 无法通过 docker、traefik、SSL 连接 HTTPS
- powershell - Powershell 预览保持自动连接到 Cloud shell
- java - 在 Java Swing 的 for 循环中创建延迟
- sql-server - 在 SQL Server 中将列从一个表复制到另一个表
- r - 为什么 R 会产生不正确的 AIC 和 BIC
- javascript - 绑定存储模型时无法使用没有 viewModel 的绑定配置
- reactjs - React Table 单元格值对应于在另一个单元格中选择的单选按钮
- javascript - 通过脚本编辑器创建的谷歌电子表格的自定义菜单调用谷歌表单并通过弹出/模式打开它
- python - 如何将带有 JSON 数据的文件上传到 django rest api?