您的位置:首页 > 数据库

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

2014-06-16 08:19 381 查看

原文:http://blog.sina.com.cn/s/blog_a49d9ef801013whu.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级联删除——删除主表同时删除从表——同时删除具有主外键关系的表

--建立类别表
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

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

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: