我有一张物品表。
每个项目都有一个Id,一个ParentId是另一个项目,还有一个ItemTypeId。
现在,我想创建一个约束来确保每个Item都有一个父。
这样做的一种方法是使ParentId不可为空。听起来很简单,但链条的顶部项目没有父项,所以这是不可能的。
我无法让Root Item拥有自己的ParentId,因为UI有时会尝试这样做,而且会导致孤立的项目。
所以下一个想法是创建一个可以为空的外键。但我实际上并不希望外键为null,除非ItemTypeId = 1。
那么,我该如何创建呢?
答案 0 :(得分:1)
您可以使用CHECK
约束:
CREATE TABLE tab(
ID INT PRIMARY KEY,
ITEM_ID_TYPE INT NOT NULL,
PARENT_ID INT NULL,
CHECK ((ITEM_ID_TYPE=1 AND PARENT_ID IS NULL) OR PARENT_ID IS NOT NULL),
CONSTRAINT FK_TAB FOREIGN KEY (PARENT_ID) REFERENCES TAB(ID)
);
<强> DBFiddle Demo 强>