如何在Id / ParentId

时间:2018-05-19 19:25:49

标签: sql-server tsql sql-server-2012

我有一张物品表。

每个项目都有一个Id,一个ParentId是另一个项目,还有一个ItemTypeId。

现在,我想创建一个约束来确保每个Item都有一个父。

这样做的一种方法是使ParentId不可为空。听起来很简单,但链条的顶部项目没有父项,所以这是不可能的。

我无法让Root Item拥有自己的ParentId,因为UI有时会尝试这样做,而且会导致孤立的项目。

所以下一个想法是创建一个可以为空的外键。但我实际上并不希望外键为null,除非ItemTypeId = 1。

那么,我该如何创建呢?

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