串聯刪除
刪除包含主索引值的行的操作,該值由其它表的現有行中的外鍵列引用。在串聯刪除中,還刪除其外索引值引用刪除的主索引值的所有行。文法:
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 NULLFOREIGN 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 NULLFOREIGN 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 ONGOSET QUOTED_IDENTIFIER ONGOALTER TRIGGER [dbo].[trigCategoryDelete]ON [dbo].[category] instead OF DELETEAS BEGINDECLARE @caId INTSELECT @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=@caIdEND |
這樣在執行對category表中記錄進行刪除的時候,觸發器執行,就會刪除對應表中的記錄,實現串聯刪除。
串聯更新與串聯刪除類似,不再贅述。原文連結:http://www.zblog.us/programing/sql/sql-delete-update.html
| 趙傑的部落格