星期一, 8月 22, 2022

[SQL] Foreign Key - Update

在前兩篇分別就 [SQL] Foreign Key - Delete 和 [SQL] Foreign Key - Insert 討論 Foreign Key,該篇紀錄 Update 的影響

以 AdventureWorks2019 Purchasing.PurchaseOrderDetail 為筆記目標 Table 並停用該 Table Trigger,方便觀察執行計畫 ,測試目的為用相同資料更新該筆資料,藉此觀察執行計畫

更新 DueDate 欄位

更新 PurchaseOrderID = 1 的 DueDate 欄位,2011-04-30 為原本資料
UPDATE Purchasing.PurchaseOrderDetail
SET DueDate = '2011-04-30'
WHERE PurchaseOrderID = 1
從執行計畫中可以看出,雖然資料本身沒有變化,但內部是有進行更新動作,不會因為資料沒有變化就沒有作動

[SQL] Foreign Key - Update-1
更新 ProductID 欄位,該欄位有 Foreign Key 關聯

更新 PurchaseOrderID = 1 的 ProductID = 1 欄位,1 為原本資料,但該欄位有 Foreign Key 關聯至Production.Product Table
UPDATE Purchasing.[PurchaseOrderDetail
SET ProductID = 1
WHERE PurchaseOrderID = 1
從執行計畫可以發現先透過 Clustered Index Seek 找到 ProductID = 1 資料後進行更新,更新後還有進 Production.Product Table 內檢查 ProductID = 1 資料是否存在

[SQL] Foreign Key - Update-2

上圖執行計畫 operator Clustered Index Seek 和 Clustered Index Update 之間有四個 Compute Scalar,為了版面就截切掉,方便閱讀執行計畫

結論是資料進行更新時,該欄位資料若是沒有異動,就不要出現在更新欄位內,若更新欄位存在又有 Foreign Key 相依,會去檢查資料是否存在,資料沒有變化卻又再次進行檢查

沒有留言:

張貼留言