在下表中,有沒有一種方法可以確保PreviousID始終使用匹配的ParentID引用行中的ID,或者,如果ParentID爲null,那麼在被引用的行中也是null?具有可空列的複合外鍵
CREATE TABLE MyTable (
ID int not null identity(1,1) primary key,
ParentID int null foreign key references MyTable (ID),
PreviousID int null foreign key reference MyTable (ID),
foreign key (ParentID, PreviousID) references MyTable (ParentID, ID)
)
一個例子:
+-ID-+-ParentID-+-PreviousID-+ | 1 | NULL | NULL | | 2 | 1 | NULL | | 3 | NULL | 2 | <-- shouldn't be possible, should have to refer to ID where ParentID is null +----+----------+------------+
有沒有辦法強制執行呢?
UPDATE:對於那些想知道,化合物外鍵不執行此由於以下原因(來自MSDN複製):
外鍵約束可以包含空值;但是,如果複合FOREIGN KEY約束的任何列包含空值,則會跳過組成FOREIGN KEY約束的所有值的驗證。要確保複合FOREIGN KEY約束的所有值都已驗證,請在所有參與的列上指定NOT NULL。
UPDATE:如果它有助於可視化數據結構表示,這是一個B-樹,其中具有相同父節點構成一個鏈表。我試圖強制鏈接列表中的每個'previous'指針指向具有相同父項的另一個節點。在父項爲空的情況下,它應指向父項也爲空的另一個節點。
觸發器?它不會執行,但可以幫助您管理它。 – 2010-10-12 21:21:45
並且MyTable中的哪個值ID應該是ParentID NULL引用? – 2010-10-13 10:14:08
當存在值時,ParentID應引用ParentID。如果沒有,那麼......這是我想解決的問題。由於複合外鍵不能實現這個功能,我正在尋找其他選項。 – Daniel 2010-10-13 14:29:02