数据库级联更新和删除

如果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,也就是最后我们看到的结果,这显然是不符合需求的。我们除了限制父表的多条 记录更新外还有什么办法呢?

你可能感兴趣的:(oracle,sql,mysql,Blog,F#)