mysql级联更新oracle_数据库级联更新和删除

本文探讨了在MySQL和Oracle中处理外键约束时遇到的问题,特别是在更新或删除主表数据时如何避免外键冲突。介绍了使用`ON DELETE CASCADE`和`ON UPDATE CASCADE`来实现级联删除和更新,以及在Oracle中通过触发器处理级联更新的限制。同时,文章提到了在多条记录更新时可能引发的问题,并引发了对于更有效解决方案的讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果a(id,name)表为主表。

b(id, a_id, name)表为从表,b.a_id外键关联到a_id。

那么如果需要更新a.id或者删除a的数据,且在b表中有数据关联到需要更新或者删除的a表纪录,那么普通的更新必然会有外键冲突。

解决方法如下:

Mysql

在b表中创建delete cascade, update cascade.

user表:

create table user

(

userid integer not null auto_increment primary key,

username varchar(12) not null

)

type=innodb;

password表:

create table password

(

userid integer not null,

password varchar(12) not null,

index (userid),

foreign key (userid) references user (userid)

on delete cascade

on update cascade

)

type=innodb;

1、MySQL支持外键约束,并提供与其它DB相同的功能,但表类型必须为 InnoDB

2、建外键的表的那个列要加上index.

Oracle

在b表中创建delete cascade.

关于级联更新需要添加trigger,当更新a.id的同时更新b.a_id.

参考trigger学习:http://zheng12tian.iteye.com/blog/838200

trigger:

create or replace trigger a_id_update after update on venue for each row

begin

if :new.id != :old.id THEN

update b set a_id=:new.id where a_id=:old.id;

end if;

end;

此种tirgger只能解决更新单条a记录的更新。

SQL 10G>select * from a;

id

----------

1

2

3

SQL 10G>select * from b;

a_id

----------

1

2

3

>update a set id=id+1;

错误结果

SQL 10G>select *from a;

P1

----------

2

3

4

SQL 10G>select * from b;

F1

----------

4

4

4

参考:http://wzwanghai.spaces.live.com/blog/cns!56626E237AFBD116!270.entry

可以看到f表的记录变成

了三4,显然这不是我们想要的结果,单父表这边把1更新成2,子表也相应把1变成2,这时候子表就有2个2了,然后父表把2更新成3,子表更新两个2成

3,这时候子表就有三个3了,当父表把3更新成4,子表会把三个3都更新成4,也就是最后我们看到的结果,这显然是不符合需求的。我们除了限制父表的多条

记录更新外还有什么办法呢?

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2011-01-18 16:00

浏览 1909

分类:数据库

评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值