一个SQL问题

本文解答了在SQL Server中创建包含自身外键及多个外键表时遇到的问题,并提供了具体的SQL脚本示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我有两张表:员工(员工id,推荐人id,店号,关联店号)员工为主键,店(店号,地址)店号为主键
我有两个问题:
1:根据实际情况,推荐人可以没有,但是如果有的话必须是某一个员工id,我再sqlserver中建立员工表自身的外键不行,报错,ALTER TABLE 语句与 COLUMN FOREIGN KEY SAME TABLE 约束 'FK_员工_员工' 冲突。该冲突发生于数据库 '员工筹薪计算',表 '员工', column '员工id。难道表自身不能建立外键吗?
2:员工中的店号字段,和关联店号字段都是店表的外键,引用店表的店号,但是实际操作中我只能建立一个外键,第二个就报错,为什么?ALTER TABLE 语句与 COLUMN FOREIGN KEY 约束 'FK_员工_店2' 冲突。该冲突发生于数据库 '员工筹薪计算',表 '店', column '店号'。

谢谢大家!! 
问题补充:
谢谢你的回答,我要补充问题:
对于第二个问题:
   如:员工表中的一条记录("00005","00001","B-1","B-2")
员工id为"00005",他的推荐人为"00001",他的店号为"B-1",而与他关联(某种关系)的店号为"B-2",实际情况中确实是这样呀,他自己的店,和关联的店必须是店表里的主键,或者为空,这不正是外键的性质吗?其中店号与关联店号不存在不一致的问题,因为实际情况中就是不相同的。
在说第一个问题,例子还是上面的记录:("00005","00001","B-1","B-2"),他的推荐人确实必学是员工表中的主键的某一项,如果表自身不能建立外键的话,请问这个问题我该如何解决?在数据变更时加一个触发器,去检查输入的推荐人是否为员工表的id字段的某一项?

 

 

你的要求是完全可以实现的,可能在建立时方法或者语法有点小问题,请确认下。

如下是我在SQL Server 2005安照你的要求建立数据表时用到的语法:
---------------------------------------------------------------
/*创建商店*/
CREATE TABLE [dbo].[Store](
[Id] [char](10) NOT NULL,  --编号
[Address] [nvarchar](100) NULL,  --地址
CONSTRAINT [PK_Store] PRIMARY KEY CLUSTERED
(
[Id] ASC  --建立主键
)
) ON [PRIMARY]

GO
/*创建员工*/
CREATE TABLE [dbo].[Employee](
[Id] [char](10) NOT NULL, --编号
[RecId] [char](10) NULL,  --推荐人编号
[Store] [char](10) NULL,  --商店编号
[RelStore] [char](10) NULL,--关联商店编号
CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED
(
[Id] ASC  --建立主键
)
) ON [PRIMARY]

GO

/*推荐ID和员工ID建立外键约束*/
ALTER TABLE [dbo].[Employee]  WITH CHECK ADD  CONSTRAINT [FK_Employee_Employee] FOREIGN KEY([RecId])
REFERENCES [dbo].[Employee] ([Id])
GO
ALTER TABLE [dbo].[Employee] CHECK CONSTRAINT [FK_Employee_Employee]
GO
/*员工商店ID和商店ID建立外键约束*/
ALTER TABLE [dbo].[Employee]  WITH CHECK ADD  CONSTRAINT [FK_Employee_Store] FOREIGN KEY([Store])
REFERENCES [dbo].[Store] ([Id])
GO
ALTER TABLE [dbo].[Employee] CHECK CONSTRAINT [FK_Employee_Store]
GO
/*员工关联店和商店ID建立外键约束*/
ALTER TABLE [dbo].[Employee]  WITH CHECK ADD  CONSTRAINT [FK_Employee_Store1] FOREIGN KEY([RelStore])
REFERENCES [dbo].[Store] ([Id])
GO
ALTER TABLE [dbo].[Employee] CHECK CONSTRAINT [FK_Employee_Store1]
GO

---------------------------------------------------------------
通过这段SQl 脚本是可以正常建立你所要求的数据表

转载于:https://www.cnblogs.com/acis_/archive/2009/07/16/1524940.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值