今天做了个测试,搞清楚了级联更新,级联删除
级联删除:当我们没有对键加级联删除的时候,删除主键表中的数据(外键表有引用的数据)时,会报错,不能删除,必须先把相关联的外键数据
删除了,才能删除主键表的数据,但如果新建外键的时候设置了级联删除,那么当我们删除主键表的数据时,数据库就会自动帮我们把相
关联的外键表数据删除掉,这个好理解
级联更新:一直困扰我,级联更新有什么用,是更新什么东西呢,今天做了个测试(mssql),终于搞清楚了一点,我们修改主键表中和外键表进
行关联的字段(一般是主键表的主键,mssql好像必须是主键),如果我们没有设置级联更新,那么这个时候会提示不能更新,因为外键表
还有数据正在和这条数据进行关联,但是如果设置了级联更新,那么外键表的数据会自动帮我们更新
贴个例子(MS SQL):
if exists ( select * from dbo.sysobjects where id = object_id (N ' orders ' ) and OBJECTPROPERTY (id, N ' IsUserTable ' ) = 1 )
drop table orders
create table orders(
id int identity primary key ,
product nvarchar ( 20 ) not null ,
customer_name nvarchar ( 20 ) not null
)
if exists ( select * from dbo.sysobjects where id = object_id (N ' customers ' ) and OBJECTPROPERTY (id, N ' IsUserTable ' ) = 1 )
drop table customers
create table customers(
name nvarchar ( 20 ) primary key
)
alter table orders add constraint fk_customerid foreign key (customer_name) references customers(name) on delete cascade on update cascade
insert into customers(name) values ( ' sun ' )
insert into orders(product,customer_name) values ( ' product a ' , ' sun ' )
insert into orders(product,customer_name) values ( ' product b ' , ' sun ' )
select * from customers
select * from orders
update customers set name = ' jun ' where name = ' sun '
select * from customers
select * from orders
在sqlserver 2000下执行一下,结果如下:
之前我用一个自动增长的int id来作为关联字段,但是在执行update customers set id=111 where id=1的时候报错了,说不能修改主键值,后来改成字符串了,就通过了
级联的作用:
1,级联删除:比如我们的新闻有评论,新闻被删除了,那么评论自然也没用了,这个时候,就可以设置级联删除让数据库帮我们删除评论,这个用法用的比较常见,
当然不是
说
每个地方都适
合
用
2,级联更新:这个一下想不到哪里有很大用处,平常即使设置了,也没见哪里体现出来。
不过有一种情况个人觉得到是可以考虑,比如说有一个需求,用户注册时用户名要唯一,但是以后可以修改用户名(当然也要是唯一的),这个时候,
可以这样设计,用户表直接用用户名来作为主键存储,然后其他表使用用户名来进行外键关联,设置级联更新,这样可以实现需求,同样可以避免因为
要得到用户名(系统中很多地方需要得到用户名)而进行的关联查询,比如一个文章列表,只需要显示文章名称,作者名称,而我们直接在文章表里面有个
用户名字段和用户名进行了关联,这样就不用去和用户表进行关联查询了,当然,如果还需要用户的其它的信息的话,那还是得去关联查询的