【问题标题】:The INSERT statement conflicted with the FOREIGN KEY constraint"INSERT 语句与 FOREIGN KEY 约束冲突”
【发布时间】:2015-12-08 09:27:31
【问题描述】:

我正在尝试将数据插入到我的 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');

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

【问题讨论】:

  • 您的Staff 表中是否存在带有id = 1staffNo?这似乎就是它所抱怨的。您有一个外键约束,因此您只能引用存在的项目。您首先需要在staff 中填充查找数据,然后才能使用 ID 链接到它。
  • 如果您不喜欢像 FK__Gym__staffNo 这样的 FK 约束名称,那么您应该像这样明确命名您的 FK 约束:ALTER TABLE Gym ADD CONSTRAINT FK_Gym_Staff FOREIGN KEY (staffNo) REFERENCES Staff(staffNo); - 通过添加这个 FK 名称,如果出现问题,您会收到更清晰、更直观和更清晰的错误消息
  • 您好坦纳,感谢您的帮助。任何表中都不存在数据。当我创建数据库时,我首先创建了表,然后是主键,然后是外键。我也尝试过先填充表然后添加外键,但我收到一个错误,说它不能添加外键。我怎样才能向员工添加一些东西?我尝试使用 INSERT INTO Staff(gymNo, position, etc..) VALUES (1, 'trainer', etc..) 但我仍然收到错误。
  • 感谢 marc_s 的考虑。我也会这样做。
  • 当我尝试在 Equipment 或 Member 中添加一些东西时,它也会抱怨gymNo。

标签: sql sql-server ssms


【解决方案1】:

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

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

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

在将支持人员添加到 Staff 之前,您无法将记录添加到 Gym。但是,在将支持的 gymNo 添加到 Gym 之前,您无法将记录添加到 Staff。这些键可防止您填充任一表,因为两者都要求记录存在于另一个表中。

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

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

【讨论】:

  • 非常有帮助。感谢您的专业知识。这是我的第一个数据库类,所以我遇到了一些麻烦 D= 我会试一试!
  • 表格设计可能是一件棘手的事情。这里有一些链接,希望对您有所帮助:www3.ntu.edu.sg/home/ehchua/programming/sql/…dreamincode.net/forums/topic/…
  • 这很有帮助。解决了我的问题,非常感谢!感谢所有评论的人,所有反馈都非常有帮助!
【解决方案2】:

你说:

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

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

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

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

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

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

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

  1. 健身房
  2. 员工(需要健身记录)
  3. 时间表(需要员工记录)
  4. 成员(需要日程记录)
  5. 设备(需要健身房和员工记录)

【讨论】:

  • 很好的建议,打算试试看。谢谢 Tanner,这很有意义。
  • 感谢您的帮助,您的方法以及其他一些方法帮助我找到了可行的解决方案。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多