2017-06-04 93 views
0

我有表如下:SQL唯一鍵IFF不會被刪除

+----------+---------+ 
| ParentId | ChildId | 
+----------+---------+ 

這是目前一個一對多的關係(父母一方,多子女)主鍵是孩子的ID,因爲孩子只能映射到一個父母(迄今爲止都很簡單)。
我的問題來自於現在儘管我想添加如下輔助柱:

+----------+---------+---------+ 
| ParentId | ChildId | Deleted | 
+----------+---------+---------+ 

因此,情況是我需要跟蹤,審計原因,刪除了父母的映射,我的想法是讓兒童Id唯一iff 刪除是錯誤的。問題是我如何實現這一目標?是否可以或者應該創建一個輔助表格來存檔已刪除的條目,其他任何建議我如何能夠實現這個目標或我可以採取的另一種方法?

回答

1

我覺得這是你的問題:

我的想法是讓子ID唯一當且僅當刪除是非常錯誤的。 問題是我如何做到這一點?

如果是這樣,你可以使用篩選唯一索引:

create unique index unq_t_parent_child on t(parent, child) 
    where isdeleted = 0; 
+0

我有看到這些類型的索引的我周圍的問題是什麼是使用這些對性能的影響,請注意我不期望寫很多,但可能有很多讀取。 – Heinrich

+0

@海因裏希。 。 。這就是你如何讓數據庫執行你所要求的約束。這樣的索引有一些開銷,就像任何其他索引一樣。這可能是實施這種約束的最便宜的方式。 –