学习数据库已经两年了,sql语句和存储过程是经常用的,感觉sql语句和存储过程就可以胜任一切的任务了,可是 今天才发现我原来是那么的笨,那么的傻

  在创建表时,经常创建主键和外键,这个样子两个表之间就建立了联系,这个样子表与表之间的连接更见紧密,而且不容易产生数据的冗余,可是当操作数据却发现主表中的数据竟然不能删除,因为外键表的数据是因主键表中的数据而生,所以在删除主键表中的数据时一定要确保它不存在于外键表中,以前我删除的时候使用sql语句先删除外键表的数据,在删除主键表中的数据,可是有的时候外键表中的数据删除了,而主键表中的数据因为某种原因没有删除,此时外键表中的数据已经删除了,此时不能做到同步,后来就用存储过程和事物一起写,如果有一个没有删除就让事物回滚,这个样子就可以做到了数据的同步删除.现在觉得很麻烦,于是看了一点资料,知道sqlserver提供级联删除功能,

 


功能:在删除主表时,自动删除副表(外键约束)相应内容

删除包含主键值的行的操作,该值由其它表的现有行中的外键列引用。在级联删除中,还删除其外键值引用删除的主键值的所有行。

如:

create database temp
go
use temp
gocreate 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 只支持级联删除