表中的外键列能被定义成引用它自己的主键/唯一键。这个技术通常用于表现递归关系。
1.创建了一个引用它自己的主键作为外键的表:
USE AdventureWorks
GO
CREATE TABLE HumanResources.Company
(
CompanyID int NOT NULL PRIMARY KEY,
ParentCompanyID int NULL,
CompanyName varchar(25) NOT NULL,
CONSTRAINT FK_Company_Company
FOREIGN KEY (ParentCompanyID)
REFERENCES HumanResources.Company(CompanyID)
)
2.在表中加入一个指定CompanyID和CompanyName的行:
INSERT HumanResources.Company
(CompanyID,CompanyName)
VALUES
(1,'MegaCorp')
3.添加第二行,这次引用的ParentCompanyID和前面插入的行相等
INSERT HumanResources.Company
(CompanyID,ParentCompanyID,CompanyName)
VALUES(2,1,'Medi-Corp')
4.尝试插入第三行,这一次为表中不存在的CompanyID指定ParentCompanyID
INSERT HumanResources.Company
(CompanyID,ParentCompanyID,CompanyName)
VALUES
(3,8,'Tiny-Corp')
该查询返回结果:
消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 FOREIGN KEY SAME TABLE 约束"FK_Company_Company"冲突。该冲突发生于数据库"AdventureWorks",表"HumanResources.Company", column 'CompanyID'。
语句已终止。
要处理父子层次,外键列ParentCompanyID必须是可空的。一个父值是NULL的公司位子公司层次的项部(也就是说它没有父公司)。在表创建后,插入了3个新行。
第一行插入的公司没有指定ParentCompanyID(也就是说这个公司的ParentCompanylD列的值是NULL):
第二行插入创建的公司引用了前面INSERT语句中定义的第一个MegaCorp公司。"1’’这个值对于ParentCompanyID列是有效的,因为它是指前面插入的行。
第三行尝试创建一个新的公司,ParentCompanyID是8,而它在表中不存在,由于CompanyID为8的公司在表中不存在,外键约束阻止行插入并报告了一个错误。行没有被插入。