小议Oracle外键约束修改行为(一)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小议Oracle外键约束修改行为(一)相关的知识,希望对你有一定的参考价值。
参考技术AOracle的外键用来限制子表中参考的字段的值 必须在主表中存在 而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时 定义了一系列的动作
在SQL 标准中定义了几种外键改变后 如何处理子表记录的动作 其中包括
限制Restrict 这种方式不允许对被参考的记录的键值执行更新或删除的操作 置为空Set to null 当参考的数据被更新或者删除 那么所有参考它的外键值被置为空
置为默认值Set to default 当参考的数据被更新或者删除 那么所有参考它的外键值被置为一个默认值
级联Cascade 当参考的数据被更新 则参考它的值同样被更新 当参考的数据被删除 则参考它的子表记录也被删除
不做操作No action 这种方式不允许更新或删除被参考的数据 和限制方式的区别在于 这种方式的检查发生在语句执行之后 Oracle默认才会的方式就是这种方式
Oracle明确支持的方式包括No action Set to null和Cascade 对于Set to Default和Restrict Oracle的约束类型并不直接支持 不过可以通过触发器来实现
简单看一下Oracle的默认处理方式No action
SQL> CREATE TABLE T_P (ID NUMBER NAME VARCHAR ( ));
表已创建
SQL> ALTER TABLE T_P ADD PRIMARY KEY (ID);
表已更改
SQL> CREATE TABLE T_C (ID NUMBER FID NUMBER NAME VARCHAR ( ));
表已创建
SQL> ALTER TABLE T_C ADD CONSTRAINT FK_T_C FOREIGN KEY (FID) REFERENCES T_P (ID);
表已更改
SQL> INSERT INTO T_P VALUES ( A );
已创建 行
SQL> INSERT INTO T_P VALUES ( B );
已创建 行
SQL> INSERT INTO T_C VALUES ( A );
已创建 行
SQL> MIT;
提交完成
对于No Action操作而言 如果主键的记录被外键所参考 那么主键记录是无法更新或删除的
SQL> DELETE T_P WHERE ID = ;DELETE T_P WHERE ID = *第 行出现错误:ORA : 违反完整约束条件 (YANGTK FK_T_C) 已找到子记录日志
SQL> UPDATE T_P SET ID = WHERE ID = ;UPDATE T_P SET ID = WHERE ID = *第 行出现错误:ORA : 违反完整约束条件 (YANGTK FK_T_C) 已找到子记录日志
SQL> DELETE T_P WHERE ID = ;
已删除 行
不过No Action又和Restrict操作有所区别 No Action允许用户执行语句 在语句执行之后 或者事务结束的时候才会检查是否违反约束 而Restrict只有检测到有外键参考主表的记录 就不允许删除和更新的操作执行了
这也使得No Action操作支持延迟约束
SQL> ALTER TABLE T_C DROP CONSTRAINT FK_T_C;
表已更改
SQL> ALTER TABLE T_C ADD CONSTRAINT FK_T_C FOREIGN KEY (FID) REFERENCES T_P (ID) DEFERRABLE INITIALLY DEFERRED;
表已更改
SQL> SELECT * FROM T_P;
ID NAME A
SQL> SELECT * FROM T_C;
ID FID NAME A
SQL> DELETE T_P WHERE ID = ;
已删除 行
SQL> INSERT INTO T_P VALUES ( A );
已创建 行
SQL> MIT;
提交完成
lishixinzhi/Article/program/Oracle/201311/17487
oracle 删除外键约束 禁用约束 启用约束
oracle 删除外键约束 禁用约束 启用约束
执行以下sql生成的语句即可
删除所有外键约束
select ‘alter table ‘||table_name||‘ drop constraint ‘||constraint_name||‘;‘ from user_constraints where constraint_type=‘R‘
禁用所有外键约束
select ‘alter table ‘||table_name||‘ disable constraint ‘||constraint_name||‘;‘ from user_constraints where constraint_type=‘R‘
启用所有外键约束
select ‘alter table ‘||table_name||‘ enable constraint ‘||constraint_name||‘;‘ from user_constraints where constraint_type=‘R‘
以上是关于小议Oracle外键约束修改行为(一)的主要内容,如果未能解决你的问题,请参考以下文章