mysql - 复合键为空且插入时约束失败

标签 mysql sql database

将我的数据插入此代码到我的数据库时出现错误。我想让 EventStaff 有一个由 StaffID.EventID 组成的主键,如下图底部所示。我看不到我做错了什么,因为 StaffID 中的表已填充并且在 TypeID 中。我试图创建两个不同表的复合键,这是错误的方法吗>我使用了图表引用。

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`db`.`EventStaff`, CONSTRAINT `fStaff1` FOREIGN KEY (`StaffID`) REFERENCES `Staff` (`StaffID`))

这是数据库的代码

CREATE TABLE  EventType (
TypeID INT NOT NULL,
Description VARCHAR(200) NULL,
CONSTRAINT pEventType PRIMARY KEY (TypeID)
);
CREATE TABLE  Staff (
StaffID INT NOT NULL,
CONSTRAINT pStaff PRIMARY KEY (StaffID)
);

CREATE TABLE  Event (
EventID INT NOT NULL,
Description VARCHAR(500) NULL,
Name VARCHAR(100) NULL,
DateStart DATE NULL,
DateEnd DATE NULL,
TimeStart TIME NULL,
TimeEnd TIME NULL,
TypeID INT NULL,
ClientID INT NULL,
NoBands BOOLEAN NOT NULL,
MaxFoodStall INT NULL,
CONSTRAINT pEvent PRIMARY KEY (EventID),
CONSTRAINT fType1 FOREIGN KEY (TypeID) REFERENCES  EventType (TypeID),
);

CREATE TABLE  EventStaff (
StaffID int NOT NULL,
EventID int NOT NULL,
Role VARCHAR(45) NULL,
PRIMARY KEY (StaffID, EventID),
CONSTRAINT fStaff1 FOREIGN KEY (StaffID) REFERENCES  Staff (StaffID),
CONSTRAINT FEvent1 FOREIGN KEY (EventID) REFERENCES  Event (EventID)
);

这里是插入内容

insert into EventType (TypeID, Description) values (1, 'Intuitive attitude-oriented hierarchy');
insert into EventType (TypeID, Description) values (2, 'Mandatory executive concept');

insert into Staff (StaffID) values (1);
insert into Staff (StaffID) values (2);

 insert into Event (EventID, Description , DateStart, DateEnd, TimeStart, TimeEnd, NoBands, MaxFoodStall, Name) values (1, 'Cloned 6th generation pricing structure', '2018-03-13', '2018-07-20', '11:18 PM', '4:58 PM', false, 17, 'Swaniawski-Ankunding');
insert into Event (EventID, Description , DateStart, DateEnd, TimeStart, TimeEnd, NoBands, MaxFoodStall, Name) values (2, 'Ameliorated mission-critical throughput', '2017-10-11', '2019-01-05', '10:44 AM', '8:26 PM', true, 4, 'Langworth-Ferry');

  insert into EventStaff (Role) values ('Editor');
 insert into EventStaff (Role) values ('Budget/Accounting Analyst IV');

https://image.ibb.co/jwaxRx/problem.png

最佳答案

您发布到此问题的代码有拼写错误,甚至无法按原样运行。一旦我修复了这些问题,我就能够重现您的外键错误。该问题实际上是由最后两个插入引起的:

INSERT INTO EventStaff (Role) VALUES ('Editor');
INSERT INTO EventStaff (Role) VALUES ('Budget/Accounting Analyst IV');

您没有指定 StaffIDEventID 的值,并且这些列已被标记为不可为空。它们是外键,如果您没有将这些列标记为不可为空,那么插入 NULL 实际上是可以的。这是消除此错误的一种方法:

INSERT INTO EventStaff (Role, StaffID, EventID)
    VALUES ('Editor', 1, 1);
INSERT INTO EventStaff (Role, StaffID, EventID)
    VALUES ('Budget/Accounting Analyst IV', 2, 2);

我不知道您打算插入什么值,但以上是此处的一种方法。

请注意,在 Event 表的插入中,您没有TypeID 列指定值,该列也是一个外键。但是,在本例中,您已将该列标记为可为空,因此 MySQL 接受它。

关于mysql - 复合键为空且插入时约束失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49983660/

相关文章:

mysql - insert ... select ... on duplicate key update + delete obsolete 行

MySQL 左连接(我认为)

php - 从 phpmyadmin Cloud9 中的文件插入表

mysql - 当 IF 为真时选择列

php - MySQL 服务器版本,用于在第 6 行 'AND epg_data.start' ' ORDER BY epg_data.start DESC' 附近使用正确的语法

database - 在循环内部或外部提交更好?

php - 在 PHP 中重命名上传的文件

mysql - js $.ajax 调用 perl,需要显示返回 fetchall_arrayref 的 perl

sql - 使用动态 sql 旋转两列

c++ - 在 C++ 中获取数据库连接