Составной ключ пуст, и ограничение не выполняется при вставке

Ошибка при вставке моих данных в этот код в мою базу данных. Я хотел, чтобы у 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

Вам по-прежнему необходимо установить значения StaffID и EventID при вставке записей EventStaff. Затем, если вам случится вставить идентификаторы, которых нет в справочных таблицах, вы получите ошибку.

RJ7 23.04.2018 16:48
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
1
33
1

Ответы 1

В коде, который вы разместили в этом вопросе, есть опечатки, и он даже не будет работать как есть. Как только я их исправил, я смог воспроизвести вашу ошибку внешнего ключа. Проблема на самом деле вызвана этими двумя последними вставками:

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

Вы не указываете значения для StaffID и EventID, и эти столбцы помечены как не допускающие значения NULL. Это внешние ключи, и было бы нормально вставить NULL, если бы вы не отметили столбцы как не допускающие значения 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, который также является внешним ключом. Однако в этом случае вы пометили столбец как допускающий значение NULL, поэтому MySQL принимает его.

Другие вопросы по теме