小议Oracle外键约束修改行为(一)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小议Oracle外键约束修改行为(一)相关的知识,希望对你有一定的参考价值。

参考技术A

  Oracle的外键用来限制子表中参考的字段的值 必须在主表中存在 而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时 定义了一系列的动作

  在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生成的语句即可

删除所有外键约束 

Sql代码 
select alter table ||table_name|| drop constraint ||constraint_name||; from user_constraints where constraint_type=R 

 禁用所有外键约束

Sql代码 
select alter table ||table_name|| disable constraint ||constraint_name||; from user_constraints where constraint_type=R

启用所有外键约束

Sql代码 
select alter table ||table_name|| enable constraint ||constraint_name||; from user_constraints where constraint_type=R  

 

 
主表 MANTIS_USER 与 子表 MANTIS_USER_ORGAN
 
 -- 创建外键(默认选项)
ALTER TABLE MANTIS_USER_ORGAN ADD CONSTRAINT fk_MANTIS_USER_ORGAN_ORG  FOREIGN KEY (org_id)  REFERENCES MANTIS_USER (ID);
--删除外键约束
ALTER TABLE MANTIS_USER_ORGAN DROP CONSTRAINT FK_MANTIS_USER_ORGAN_ORG;

 

 
参考文章:
 
 
 

以上是关于小议Oracle外键约束修改行为(一)的主要内容,如果未能解决你的问题,请参考以下文章

怎样在oracle中创建主外键和唯一约束

oracle为表建立外键时没有命名FOREIGN KEY约束,现在想删外键怎么办??

ORACLE语句怎么删除外键约束,只是删约束,不是删表

Oracle定义约束外键约束

ORACLE外键约束(FORIGEN KEY)

oracle 外键 删除