sql server 2005 级联删除
学习数据库已经两年了,sql语句和存储过程是经常用的,感觉sql语句和存储过程就可以胜任一切的任务了,可是 今天才发现我原来是那么的笨,那么的傻
在创建表时,经常创建主键和外键,这个样子两个表之间就建立了联系,这个样子表与表之间的连接更见紧密,而且不容易产生数据的冗余,可是当操作数据却发现主表中的数据竟然不能删除,因为外键表的数据是因主键表中的数据而生,所以在删除主键表中的数据时一定要确保它不存在于外键表中,以前我删除的时候使用sql语句先删除外键表的数据,在删除主键表中的数据,可是有的时候外键表中的数据删除了,而主键表中的数据因为某种原因没有删除,此时外键表中的数据已经删除了,此时不能做到同步,后来就用存储过程和事物一起写,如果有一个没有删除就让事物回滚,这个样子就可以做到了数据的同步删除.现在觉得很麻烦,于是看了一点资料,知道sqlserver提供级联删除功能,
功能:在删除主表时,自动删除副表(外键约束)相应内容
删除包含主键值的行的操作,该值由其它表的现有行中的外键列引用。在级联删除中,还删除其外键值引用删除的主键值的所有行。
如:
create database temp
go
use temp
go
create table UserInfo
(
UserId int identity(1,1) primary key ,
UserName varchar(20),
password varchar(20) not null --密码
)
create table UserDetails
(
id int identity(1,1) primary key,
name varchar(50) not null, --真实姓名
userId int,
foreign key (userId) references UserInfo(UserId) on delete cascade
)
insert UserInfo values ('ly','jeff')
insert UserInfo values('wzq','wzqwzq')
insert UserInfo values('lg','lglg')
insert UserDetails values('李四',1)
insert UserDetails values('王五',2)
insert UserDetails values('刘六',3)
此时:Delete From UserInfo Where UserId = 1 就可删除UserInfo表和UserDetails表的UserId=1 的内容
当你的已经创建好了的时候不需要修改,只需要添加上
级联删除功能就可以了,代码如下
alter table 表名
add constraint 约束名
foreign key(字段名) references 主表名(字段名)
on delete cascade
同事sql 还支持级联更新.
oracle 只支持级联删除