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

原文:http://blog.sina.com.cn/s/blog_a49d9ef801013whu.html

级联删除

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

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

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

关系图以下:spa

sql表关系图

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

经过触发器设置级联删除

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

USE [NewsSystem] GO 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表中记录进行删除的时候,触发器执行,就会删除对应表中的记录,实现级联删除。blog

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

相关文章
相关标签/搜索