SQL数据库基础之级联删除和级联更新

级联删除

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

Foreign Key(column[,...n])
references referenced_table_name[(ref_column[,...n])]
[on delete cascade]
[on update cascade]

注释:column:列名referenced_table_name:外键参考的主键表名称ref_name:外键要参考的表的主键列on delete:删除级联on update:更新级联

SQL级联删除——删除主表同时删除从表——同时删除具有主外键关系的表

--建立类别表
create table category
(
	id int identity(1,1) primary key,
	[name] varchar(20) not null
	
)
--建立新闻表
create table news
(
	id int identity(1,1) primary key,
	title varchar(10) not null,
	[content] text not null,
	createTime datetime not null,
	caId int not null
	foreign key (caId) references category(id) on delete cascade

)
--建立评论表
create table comment
(
	id int identity(1,1) primary key,
	[content] text not null,
	createTime datetime not null,
	userIp varchar(15) not null,
	newsId int not null
	foreign key (userId) references news(id) on delete cascade
  

关系图如下:

一个新闻类别对应着0个或者多个新闻,一个新闻对应着0个或者多个评论。在建立这三张表时,同时建立了news表到category的外主键约束和级联删除,以及comment表到news表的外主键约束和级联删除。这样的话,只要删除category表中的记录,对应着其它表中的记录也会跟着删除。

通过触发器设置级联删除

例子同上。在建立表的时候不设置级联删除,而是通过触发器实现。在category表中建立instead of触发器,实现级联删除。

USE [NewsSystem]
GO
/****** Object:  Trigger [dbo].[trigCategoryDelete]    Script Date: 03/06/2012 20:28:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER trigger [dbo].[trigCategoryDelete]
on [dbo].[category]
 instead of DELETE
AS 
BEGIN
	declare @caId int
	select @caId=id from deleted
	--删除评论
	delete comments where newsId in (select newsId from news where caId=@caId)
	--删除新闻
	delete news where caId=@caId
	--删除类别
	delete category where id=@caId
END

这样在执行对category表中记录进行删除的时候,触发器执行,就会删除对应表中的记录,实现级联删除。

级联更新与级联删除类似,不再赘述。

原文链接: http://www.zblog.us/programing/sql/sql-delete-update.html | 赵杰的博客

你可能感兴趣的:(sql,数据库,table,null,delete,Comments)