INSERT语句与FOREIGN KEY约束冲突“

时间:2015-12-08 09:27:31

标签: sql sql-server ssms

我正在尝试将数据插入到我的SQL Server 2014版本中,并且我一直收到此错误。我尝试在互联网上搜索,在我的结果中,我得到了人们所说的但仍然难以理解我的特定代码的错误。

所有表都是空的,没有数据。设置外键后,我无法添加数据。我读到必须填充这两个表才能使用,但是当我无法添加任何内容时会发生什么?如果我在外键之前添加数据,那么我无法添加外键。请帮忙!

当尝试使用INSERT INTO将数据插入Gym行时,我收到此错误:

  

INSERT语句与FOREIGN KEY约束“FK__Gym__staffNo”冲突。冲突发生在数据库“FitnessApp”,表“dbo.Staff”,列'staffNo'。

尝试将数据添加到EquipmentStaff表时也会发生这种情况。

请参阅此处的代码:

架构:

CREATE TABLE Gym
(
gymNo int NOT NULL IDENTITY(1,1),
staffNo int NOT NULL,
streetAddress varchar(100) NOT NULL,
streetAddress2 varchar(100) NULL,
city varchar(50) NOT NULL,
state char(2) NOT NULL,
zip char(5) NOT NULL,
phone char(10) NOT NULL
) ON [fitnessPlusGroup1];

CREATE TABLE Staff
(
staffNo int NOT NULL IDENTITY(1,1),
gymNo int NOT NULL,
position varchar(50) NOT NULL,
firstName varchar(50) NOT NULL,
lastName varchar(50) NOT NULL,
streetAddress varchar(100) NOT NULL,
streetAddress2 varchar(100) NULL,
city varchar(50) NOT NULL,
state char(2) NOT NULL,
zip char(5) NOT NULL,
phone char(10) NOT NULL,
hireDate date NOT NULL
) ON [fitnessPlusGroup1];

CREATE TABLE Member
(
memberNo int NOT NULL IDENTITY(1,1),
gymNo int NOT NULL,
firstName varchar(30) NOT NULL,
lastName varchar(30) NOT NULL,
streetAddress varchar(100) NOT NULL,
streetAddress2 varchar(100) NULL,
city varchar(50) NOT NULL,
state char(2) NOT NULL,
zip char(5) NOT NULL,
phone char(10) NOT NULL,
memberSince date NOT NULL,
scheduleID int NULL
) ON [fitnessPlusGroup1];

CREATE TABLE Schedule
(
scheduleID int NOT NULL IDENTITY(1,1),
staffNo int NOT NULL,
trainDate date NOT NULL,
trainTime time(0) NOT NULL
) ON [fitnessPlusGroup1];

CREATE TABLE Equipment
(
equipNo int NOT NULL IDENTITY(1,1),
gymNo int NOT NULL,
staffNo int NOT NULL,
name varchar(50) NOT NULL,
quantity int NOT NULL
) ON [fitnessPlusGroup1];

外键关系设置:

ALTER TABLE Gym
ADD FOREIGN KEY (staffNo) REFERENCES Staff(staffNo);

ALTER TABLE Staff
ADD FOREIGN KEY (gymNo) REFERENCES Gym(gymNo); 

ALTER TABLE Member
ADD FOREIGN KEY (gymNo) REFERENCES Gym(gymNo);

ALTER TABLE Member
ADD FOREIGN KEY (scheduleID) REFERENCES Schedule(scheduleID);

ALTER TABLE Schedule
ADD FOREIGN KEY (staffNo) REFERENCES Staff(staffNo);

ALTER TABLE Equipment
ADD FOREIGN KEY (gymNo) REFERENCES Gym(gymNo);

ALTER TABLE Equipment
ADD FOREIGN KEY (staffNo) REFERENCES Staff(staffNo);

提供错误的插入命令:

INSERT INTO Gym(staffNo, streetAddress, streetAddress2, city, state, zip, phone) 
VALUES (1, '7300 W Greens Rd', NULL, 'Houston', 'TX', '77064', '2818946151');

任何帮助都会非常感谢抱歉,如果这看起来有点多,我希望我能提供所有的信息..

2 个答案:

答案 0 :(得分:2)

我认为问题出在你的桌面设计中。拿这两个FKEY作为一个例外:

ALTER TABLE Gym
ADD FOREIGN KEY (staffNo) REFERENCES Staff(staffNo);

ALTER TABLE Staff
ADD FOREIGN KEY (gymNo) REFERENCES Gym(gymNo); 

在将支持人员添加到员工之前,您无法向健身房添加记录。但是,在您将支持gymNo添加到Gym之前,您无法向Staff添加记录。这些键会阻止您填充任何一个表,因为两个表都需要在另一个表中存在记录。

这是为什么?因为FKey就像一个承诺。它保证列 x 中的值始终可以在表 y 中找到。为了履行此承诺,必须首先填充 y 。但是当你有一个循环引用时,回到原始表,这是永远无法实现的。

这是一种可能的解决方案。您可以从Staff中删除GymNo中的staffNo。然后添加一个新表StaffGym。这个表有两个字段staffNo和gymNo。它将在工作人员和健身房之后填充,提供两者之间的桥梁。这称为交叉引用表,有时也称为外部参照。

答案 1 :(得分:0)

你说:

  

所有表都是空的,没有数据。

因此staffNo中没有id = 1 Staff。您已获得外键约束,因此您只能引用存在的项。因此,您首先需要在Staff中填充查找数据,然后才能使用ID链接到它。

此外,删除StaffGym之间的约束之一,你有这个:

ALTER TABLE Gym
ADD FOREIGN KEY (staffNo)
REFERENCES Staff(staffNo);

ALTER TABLE Staff
ADD FOREIGN KEY (gymNo)
REFERENCES Gym(gymNo);

当你只需要其中一个时。我说要从Gym删除它,因为健身房可能会有很多我假设的工作人员,并且还会从StaffNo删除Gym列。因为这会阻止你创建一个没有另一个。删除该链接后,您应该按正确的顺序插入数据。

插入顺序很关键。如果删除上面建议的列,则应根据约束按以下顺序插入:

  1. 健身房
  2. 工作人员(需要健身记录)
  3. 时间表(需要员工记录)
  4. 会员(需要时间表记录)
  5. 设备(需要健身房和员工记录)