很多時候,我們會碰到這樣的場景:「
刪除乙個表的資料的時候,將另乙個表的相關資料刪除。」
這裡是建立兩張表的指令碼:
create
table [dbo].[productcategory](
[id] [uniqueidentifier] not
null,
[name] [varchar](50) null,
constraint [pk_productcategory] primary
keyclustered
( [id] asc
)with (pad_index = off, statistics_norecompute = off, ignore_dup_key = off, allow_row_locks = on, allow_page_locks = on) on [primary]
) on [primary]
create
table [dbo].[product](
[id] [uniqueidentifier] not
null,
[categoryid] [uniqueidentifier] null,
[name] [varchar](50) null,
[price] [decimal](18, 0) not
null,
constraint [pk_product] primary
keyclustered
( [id] asc
)with (pad_index = off, statistics_norecompute = off, ignore_dup_key = off, allow_row_locks = on, allow_page_locks = on) on [primary]
) on [primary]
建立後的表大致如下:
一些實驗資料:
insert into [test].[dbo].[productcategory] values('4b07a7d0-b56a-4de3-9f55-972ac6d60994','category1');
insert into [test].[dbo].[product] values(newid(),'4b07a7d0-b56a-4de3-9f55-972ac6d60994','product1','1');
insert into [test].[dbo].[product] values(newid(),'4b07a7d0-b56a-4de3-9f55-972ac6d60994','product2','2');
insert into [test].[dbo].[product] values(newid(),'4b07a7d0-b56a-4de3-9f55-972ac6d60994','product3','3');
insert into [test].[dbo].[product] values(newid(),'4b07a7d0-b56a-4de3-9f55-972ac6d60994','product4','4');
有很多種方法可以實現這個功能:
在模型層中處理:
public
class productcategoryrepository
}
這個比較簡單也很容易理解,但是它有個問題:如果是直接通過執行sql 來刪除category的。那麼這個約束就無法滿足了,或者是說你必須記得如果要刪除category的話,那麼就應該使用deletecategory方法。
其實可以通過觸發器來級聯刪除:
具體的觸發器**如下:
create
trigger [dbo].[deleterelatedproducts] on [dbo].[productcategory]
after
delete
asbegin
set nocount on;
delete
from [dbo].[product] where categoryid in
(select id from deleted
)end
這種方式比較簡單,而且語法也很明了:
具體資料可以參照:
還有一種方式可能並不是很多人知道:
外來鍵的級聯刪除和更新:
在sql server 中可以通過設定外來鍵的級聯刪除和更新來實現這個功能。
這裡是外來鍵的定義:來自 簡介
外來鍵(foreign key)
如果公共關鍵字在乙個關係中是主關鍵字,那麼這個公共關鍵字被稱為另乙個關係的外來鍵。由此可見,外來鍵表示了兩個關係之間的聯絡。以另乙個關係的外來鍵作主關鍵字的表被稱為主表,具有此外鍵的表被稱為主表的從表。外來鍵又稱作外關鍵字。換而言之,如果關係模式r中的某屬性集不是r的主鍵,而是另乙個關係r1的主鍵則該屬性集是關係模式r的外來鍵,通常在資料庫設計中縮寫為fk。
外來鍵的作用
保持資料一致性,完整性,主要目的是控制儲存在外鍵表中的資料。 使兩張表形成關聯,外來鍵只能引用外表中的列的值或使用空值
我們現在的要求是刪除productcategory的時候,同時刪除該productcategory下面的product。
所以應該在product 表中建立外來鍵約束,
看到刪除規則了嗎,指定為層疊的話,那麼當刪除productcategory的時候,就會刪除product了。
select * from productcategory;
select * from product;
delete
from productcategory;
select * from productcategory;
select * from product;
結果如下:
上面是表級聯刪除的帖子,這時候主角應該登場了
其實我們可以使用事務,transaction 來實現這樣的行為。
原因:說這種級聯的關係本來就是業務邏輯,需要在程式的業務層來用**控制,把這種業務關係交給資料庫處理是非常不合理的。
我也更傾向於,把**都寫在程式了,盡量少用儲存過程。這樣也更加有利於跨資料庫,和以後的維護。
不過如果邏輯不是很複雜,都是可以考慮使用的。這個就仁者見仁,智者見智了。但事務操作的優勢是很明顯的。
mysql資料處理 事務
事務 乙個原子操作,乙個最小的執行單元,可以有乙個或者多個sql語句組成。當乙個事務中有一句sql語句執行失敗,則整個事務失敗。執行一條dml語句 增刪改 執行性成功叫提交 1 顯示提交 commit 2 隱式提交,語句執行完成或正常 退出 執行失敗叫回滾 1 顯示回滾 rollback 2 運勢回...
資料庫分表後如何處理事務問題
隨著時間和業務的發展,資料庫中表的資料量會越來越大,相應地,資料操作,增刪改查的開銷也會越來越大。因此,把其中一些大表進行拆分到多個資料庫中的多張表中。本篇文章是基於非事務訊息的非同步確保的方式來完成分庫分表中的事務問題。由於分庫分表之後,新錶在另外乙個資料庫中,如何保證主庫和分庫的事務性是必須要解...
事務處理 資料庫事務
事務簡介 事務的作用 事務的作用是將一系列操作作為乙個整體,一但其 現問題,會回滾到事務的開始狀態。即事務維護了資料的完整性和一致性。事務的四個特性 acid 原子性 事務的操作是原子不可分割的。一致性 事務的運算元據保證一致性,不存在一部分改變一部分不改變。隔離性 隔離性是當多個使用者併發訪問資料...