В следующей таблице есть ли способ гарантировать, что PreviousID всегда ссылается на идентификатор в строке с совпадающим ParentID, или, если ParentID равен нулю, он также равен нулю в указанной строке?
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
+----+----------+------------+
Есть ли способ применить это?
ОБНОВЛЕНИЕ : Для тех, кому интересно, составной внешний ключ не применяет это дляследующая причина (скопирована из MSDN ):
Ограничение FOREIGN KEY может содержать нулевые значения;однако, если какой-либо столбец составного ограничения FOREIGN KEY содержит нулевые значения, проверка всех значений, составляющих ограничение FOREIGN KEY, пропускается.Чтобы убедиться, что все значения составного ограничения FOREIGN KEY проверены, укажите NOT NULL для всех участвующих столбцов.
UPDATE : в случае, если это помогает визуализировать структуру данныхбудучи представленным, это B-дерево, где узлы, имеющие одного и того же родителя, составляют связанный список.Я пытаюсь обеспечить, чтобы каждый «предыдущий» указатель в связанном списке указывал на другой узел с тем же родителем.В случае, если родительский элемент является нулевым, он должен указывать на другой узел, где родительский элемент также является нулевым.