同一个表中RowParentId的约束?

时间:2009-04-16 20:30:13

标签: sql-server

如何在允许为null的字段上指定约束但如果值存在则应该是现有表中主键的值之一? 看看代码:

  CREATE TABLE TestTable 
(
    RowId int IDENTITY NOT NULL PRIMARY KEY,
    RowParentId int NULL, -- < how do I specify constraint that RowParentId if not NULL should be RowId (foreign key to existing table?)
    RowName nvarchar(30),
    RowShortName nvarchar(10)
)
GO

我希望能够生成父子视图,而不会限制现有父级的深度和强制约束。

希望我能够传达我正在寻找的东西。

干杯

5 个答案:

答案 0 :(得分:5)

这不仅仅是外键吗?

RowParentId int NULL references ParentTable (ParentTableIdColumn),

如果它不为null,则它必须是父表中的值。

答案 1 :(得分:1)

ALTER TABLE TestTable
ADD CONSTRAINT fk_testtable_parent
FOREIGN KEY (RowParentId)
REFERENCES TestTable(RowId)

请注意,在列中保留NULL是一个坏主意,因为索引无法搜索。

您最好使用id = 0添加代理记录,将您的真实根引用到此记录中,并将其从选择中排除。

答案 2 :(得分:0)

您可以拥有一个引用回同一个表的外键约束。您可能希望查看层次结构的其他模型。链式链模型在SQL中存在很多问题。在Google上使用“Joe Celko层次结构”,您应该能够找到有关模拟层次结构的其他方法的信息。

答案 3 :(得分:0)

您想要创建外键。有几种方法可以做到这一点,但像这样的单个键的最简单方法是在该列的workld“null”之后添加以下内容:

references table_name (column_name)

您可能需要在此之前添加“外键”字样,我不记得了。无论哪种方式都应该照顾它。

答案 4 :(得分:0)

ALTER TABLE [dbo] .TestTable with CHECK ADD CONSTRAINT [FK_TestTable_RowId_TestTable_RowParentId] FOREIGN KEY(RowParentId)REFERENCES TestTable(RowId)