sunjun

sunjun

导航

SQL级联更新,级联删除

今天做了个测试,搞清楚了级联更新,级联删除
级联删除:当我们没有对键加级联删除的时候,删除主键表中的数据(外键表有引用的数据)时,会报错,不能删除,必须先把相关联的外键数据
            删除了,才能删除主键表的数据,但如果新建外键的时候设置了级联删除,那么当我们删除主键表的数据时,数据库就会自动帮我们把相
            关联的外键表数据删除掉,这个好理解
级联更新:一直困扰我,级联更新有什么用,是更新什么东西呢,今天做了个测试(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(20not null,
    customer_name nvarchar(20not 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(20primary 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,级联更新:这个一下想不到哪里有很大用处,平常即使设置了,也没见哪里体现出来。
                  不过有一种情况个人觉得到是可以考虑,比如说有一个需求,用户注册时用户名要唯一,但是以后可以修改用户名(当然也要是唯一的),这个时候,
                  可以这样设计,用户表直接用用户名来作为主键存储,然后其他表使用用户名来进行外键关联,设置级联更新,这样可以实现需求,同样可以避免因为
                  要得到用户名(系统中很多地方需要得到用户名)而进行的关联查询,比如一个文章列表,只需要显示文章名称,作者名称,而我们直接在文章表里面有个
                  用户名字段和用户名进行了关联,这样就不用去和用户表进行关联查询了,当然,如果还需要用户的其它的信息的话,那还是得去关联查询的


posted on 2009-09-26 21:58  sunjun  阅读(18914)  评论(4编辑  收藏  举报