知识大全 小议Oracle外键约束修改行为(一)
Posted 操作
篇首语:农村四月闲人少,勤学苦攻把名扬。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 小议Oracle外键约束修改行为(一)相关的知识,希望对你有一定的参考价值。
小议Oracle外键约束修改行为(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
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;
提交完成
cha138/Article/program/Oracle/201311/17487相关参考
Oracle外键的相关约束中级联删除的方案 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! SQL
知识大全 oracle中如何判断本表有多少张表对其有外键关联
在oracle中如何判断本表有多少张表对其有外键关联?我们主要分为两步 第一步 //查询表的主键约束名 select*fromuser_constraintsewhereetable_nam
键约束和参绍约束的实例脚本/*外键约束和参绍约束pubs数据库的CarIfo表创建外键约束参绍CarFactory表的主键ID 外键约束和参绍约束的实例脚本cha138/Article
外键约束和参绍约束的实例脚本 /*外键约束和参绍约束pubs数据库的CarIfo表创建外键约束参绍CarFactory表的主键ID*/USEPubsGO/*不显示行数*/SETNOCOUNT
Copy from TheOracle(tm)UsersCoOperativeFAQ Parent/Child/KeyReference setpagessetfeedbackoffspool
小议Oracle11g的自治事务(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 这两天看了
如何在Oracle中用非默认方式创建外键 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 创建外键
Oracle中非默认方式创建外键的使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 创建外键约
小议Oracle11g的自治事务(六) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 自治事务提
小议Oracle11g的自治事务(二) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 自治事务实