INSERT 语句与 FOREIGN KEY 约束冲突”

The INSERT statement conflicted with the FOREIGN KEY constraint"

我正在尝试将数据插入到我的 SQL Server 2014 版本中,但我一直收到此错误。我尝试在整个互联网上搜索,最后,我有点明白人们在说什么,但仍然难以理解我的特定代码有什么问题。

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

尝试使用 INSERT INTO 将数据插入 Gym 行时出现此错误:

The INSERT statement conflicted with the FOREIGN KEY constraint "FK__Gym__staffNo". The conflict occurred in database "FitnessApp", table "dbo.Staff", column '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');

如果这看起来有点多,我将不胜感激,我希望我提供了所有可能的信息..

你说:

All tables are empty without data.

所以你的 Staff 中没有 staffNoid = 1。你有一个外键约束,所以你只能引用存在的项目。因此,您首先需要在 Staff 中填充查找数据,然后才能使用 ID link 查找数据。

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

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

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

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

插入的顺序是关键。如果您删除我上面建议的列,您应该根据您的限制按以下顺序插入:

  1. 健身房
  2. 工作人员(需要健身记录)
  3. 日程安排(需要人员记录)
  4. 会员(需要日程记录)
  5. 设备(需要健身房和员工记录)

我认为问题出在您的 table 设计上。以这两个FKEY为例:

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

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

在将支持的 staffNo 添加到 Staff 之前,您不能向 Gym 添加记录。但是,在将支持的 gymNo 添加到 Gym 之前,您不能将记录添加到 Staff。这些键会阻止您填充任何一个 table,因为两者都需要记录存在于另一个中。

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

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