SqlServer2008实例24键之创建递归外键引用

表中的外键列能被定义成引用它自己的主键/唯一键。这个技术通常用于表现递归关系。

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的公司在表中不存在,外键约束阻止行插入并报告了一个错误。行没有被插入。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ngbshzhn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值