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