我想换电脑主机怎么换显卡 请问一下这是我现在的电脑主机怎么换显卡 是更换配件划算 还是直接换一台新的划算 麻

查看: 469|回复: 3
用 触发器实现级联删除,外键不设延迟约束也行 ?
论坛徽章:304
本帖最后由 ZALBB 于
16:25 编辑
ORACLE 11204
刚做了个测试,新建了个 行级别的&&after update 级联触发器。目标是测试:更改主键ID值后,用该类型的级联触发器更改 外键ID,此时,是否需要把外键约束设置成延迟约束?
过程如下:
SCOTT@ncdb&CREATE TABLE CLASS (CID NUMBER PRIMARY KEY, NAME VARCHAR2(30));
Table created.
Elapsed: 00:00:00.05
SCOTT@ncdb&CREATE TABLE STUDENT (SID&&NUMBER, NAME VARCHAR2(30), CID NUMBER REFERENCES CLASS);
Table created.
Elapsed: 00:00:00.02
SCOTT@ncdb&select constraint_name, constraint_type, deferrable, deferred, status, validated, delete_rule, rely from user_constraints where table_name='STUDENT';
CONSTRAINT_NAME& && && && && & C DEFERRABLE& &&&DEFERRED&&STATUS& &VALIDATED& &&&DELETE_RU RELY
------------------------------ - -------------- --------- -------- ------------- --------- ----
SYS_C0011197& && && && && && & R NOT DEFERRABLE IMMEDIATE ENABLED&&VALIDATED& &&&NO ACTION
Elapsed: 00:00:00.17
SCOTT@ncdb&select *
no rows selected
Elapsed: 00:00:00.00
SCOTT@ncdb&INSERT INTO CLASS SELECT 1, 'CLASS 1' FROM DUAL;
1 row created.
Elapsed: 00:00:00.02
SCOTT@ncdb&
SCOTT@ncdb&INSERT INTO STUDENT SELECT 101,'', 1 FROM DUAL;
INSERT INTO STUDENT SELECT 102,'', 1 FROM DUAL;
INSERT INTO STUDENT SELECT 103,'', 1 FROM DUAL;
1 row created.
Elapsed: 00:00:00.01
SCOTT@ncdb&
1 row created.
Elapsed: 00:00:00.00
SCOTT@ncdb&
1 row created.
Elapsed: 00:00:00.00
SCOTT@ncdb&
Commit complete.
Elapsed: 00:00:00.00
SCOTT@ncdb&select *
& && & CID NAME
---------- ------------------------------
& && && &1 CLASS 1
Elapsed: 00:00:00.00
SCOTT@ncdb&select *
& && & SID NAME& && && && && && && && && && && & CID
---------- ------------------------------ ----------
& && & 101& && && && && && && && && && && && && &&&1
& && & 102& && && && && && && && && && && && && &&&1
& && & 103& && && && && && && && && && && && && &&&1
Elapsed: 00:00:00.00
SCOTT@ncdb&create or replace trigger tri_cascades
after update of cid on class
for each row
&&update student set cid = :new.cid where cid=ld.
end tri_&&2& & 3& & 4& & 5& & 6& & 7&&
Trigger created.
Elapsed: 00:00:00.03
SCOTT@ncdb&update class set cid=2 where cid=1;
1 row updated.
Elapsed: 00:00:00.02
SCOTT@ncdb&select *
& && & SID NAME& && && && && && && && && && && & CID
---------- ------------------------------ ----------
& && & 101& && && && && && && && && && && && && &&&2
& && & 102& && && && && && && && && && && && && &&&2
& && & 103& && && && && && && && && && && && && &&&2
Elapsed: 00:00:00.00
得到的结论: 不需要把外键约束设置成延迟约束。 这与我的理解有冲突,我觉得,事件的执行顺序应该是这样:
1 BEFORE 行级触发器。
2 修改主键ID 的SQL语句。
& &--- 此处应该引发外键约束做检查,
3 AFTER 行级触发器。
这样,当在第2步更改了主键 ID 值后,外键约束应该立即被触发检查外键值是否存在,或者是,更改主键值前,就该检查外键表中是否存在 老的主键ID值,若存在,不允许更改,
但实际上,外键约束的触发操作发生在 AFTER 行级触发器之后,,,,也就是,用触发器做级联更改时,用不着对外键约束做延迟!!!
论坛徽章:304
这现象,没人怀疑过?
认证徽章论坛徽章:8
老大的这个问题确实很有启发性。
1、老大把before trigger,SQL,after trigger分开列,我觉得稍有不妥 ,因为是SQL触发了trigger,所以,trigger应该和SQL是一体的。
2、因为SQL和trigger是一体的,因此,如果trigger代码发生错误,那么,SQL修改操作也是不成功的,应该是报错返回,操作都没成功,外键检查没必要;还有,就像老大例子写的那样,如果外键先检查,那也限制了这个功能,就是无论如何,在不修改子表外键列的前提下,直接修改父表主键列都是不可能的。
所以,目前外键检查在触发后还是比较合理的,个人愚见,供参考讨论。
论坛徽章:304
sqysl 发表于
老大的这个问题确实很有启发性。
1、老大把before trigger,SQL,after trigger分开列,我觉得稍有不妥 , ...
不是很清楚你的意思,
1 SQL 和TRIGGGER 是一体的,因此,,,外键检查没必要,,,
=》即便一体,触发器的类型也决定语句执行的先后顺序,轮到谁就该谁执行,结果对错都是正常的,
2 若外键先检查,那也限制了这个功能,
=》 若外键约束设置成延迟属性,则这方法是可行的,
我上面列出来的是语句的执行顺序,这里的语句,包括了触发器,及引发触发器的SQL,
我的意思是,在执行UPDATE时,就应该立即触发外键约束,因为这个外键没有设置成延迟,但ORACLE
却把外键约束触发顺序安排在 AFTER 触发器之后,这不合理,换句话说,若设置外键约束成延迟属性,
这就合理了,
网上很多案例,把外键约束设置成延迟后,再和触发器结合一起做级联修改测试,我很奇怪,难道他们没发现没必要做延迟设置?还是说我这思维古怪?
itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号: 广播电视节目制作经营许可证:编号(京)字第1149号文章- 400&
&&&&&&&&&&&&&
create table a(id& varchar(20) primary key,password varchar(20) not null)create table b(id int identity(1,1)& primary key,name varchar(50) not null,userId varchar(20),foreign key (userId) references a(id) on delete cascade)表B创建了外码userId 对应A的主码ID,声明了级联删除测试数据:insert a values ('11','aaa')insert a values('23','aaa')insert b values('da','11')insert b values('das','11')insert b values('ww','23')删除A表内id为&11&的数据,发现B表内userId 为&11&也被数据库自动删除了,这就是级联删除delete a where id='11'
&posted on
阅读(...) 评论()

我要回帖

更多关于 电脑主机怎么换显卡 的文章

 

随机推荐