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

級聯更新與級聯刪除相似,再也不贅述。

相關文章
相關標籤/搜索