如果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记录的更新。
----------
1
2
3
SQL 10G>select * from b;
----------
1
2
3
>update a set id=id+1;
错误结果
----------
2
3
4
----------
4
4
4