Сбой ограничения внешнего ключа в MySQL

#mysql

#mysql

Вопрос:

Я создал следующие две таблицы, используя приведенные ниже команды:

 CREATE TABLE Emp (
   Empno INT(11) NOT NULL,
   Ename VARCHAR(50) NOT NULL,
   Job VARCHAR(50) NULL,
   Mgrno INT(11) NULL,
   Hiredate VARCHAR(50) NULL,
   Sal INT(11) NOT NULL,
   Comm INT(11) NULL,
   Deptno INT(11) NOT NULL,
   CHECK(Sal >= 1000 AND Sal <= 10000),
   PRIMARY KEY (Empno),
   FOREIGN KEY (Deptno) REFERENCES Emp(Empno)
);

CREATE TABLE Dept (
   Deptno INT(11) NOT NULL,
   Dname VARCHAR(50) NOT NULL,
   Location VARCHAR(50) NOT NULL,
   PRIMARY KEY (Deptno)
);
  

Однако, когда я пытаюсь ввести данные в таблицу Emp, используя следующую команду:

 INSERT INTO Emp (Empno, Ename, Job, Mgrno, Hiredate, Sal, Comm, Deptno) VALUES (7839, 'ALAN', 'TRAINER', NULL, '17-NOV-13', 5000, NULL, 10);
  

Я получаю сообщение об ошибке:

 ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`s102859495_db`.`Emp`, CONSTRAINT `Emp_ibfk_1` FOREIGN KEY (`Deptno`) REFERENCES `Emp` (`Empno`))
  

Я не знаю, что вызывает эту ошибку и как ее исправить. Я уже ввел соответствующую запись в таблицу Dept:

 INSERT INTO Dept(Deptno, Dname, Location) VALUES (10, 'CONSULTING','ADELAIDE'); 
  

Любая помощь будет высоко оценена.

Ответ №1:

Вы использовали неправильный синтаксис в своем запросе на создание таблицы Emp.

Вы предоставляете ссылочный ключ для ССЫЛОК Emp (Empno). Это будет отдел ССЫЛОК (Deptno)

Проверьте правильный синтаксис ниже

  CREATE TABLE Emp (
   Empno INT(11) NOT NULL,
   Ename VARCHAR(50) NOT NULL,
   Job VARCHAR(50) NULL,
   Mgrno INT(11) NULL,
   Hiredate VARCHAR(50) NULL,
   Sal INT(11) NOT NULL,
   Comm INT(11) NULL,
   Deptno INT(11) NOT NULL,
   CHECK(Sal >= 1000 AND Sal <= 10000),
   PRIMARY KEY (Empno),
   FOREIGN KEY (Deptno) REFERENCES Dept(Deptno)
);
  

Ответ №2:

Сообщение об ошибке довольно четкое: вы пытаетесь создать нового сотрудника, который принадлежит отделу 10 , но этот номер отдела еще не существует в таблице departement. Ограничение внешнего ключа предотвращает это.

Вы можете проверить, существует ли подразделение с помощью следующего запроса (который должен возвращать пустой результирующий набор):

 SELECT * FROM Dept WHERE Deptno = 10;
  

Либо сначала добавьте недостающий отдел в родительскую таблицу::

 -- create the department
INSERT INTO Dept (Deptno, Dname, Location)
VALUES (10, 'foo', 'bar');

-- Then create the employee
INSERT INTO Emp (Empno, Ename, Job, Mgrno, Hiredate, Sal, Comm, Deptno) 
VALUES (7839, 'ALAN', 'TRAINER', NULL, '17-NOV-13', 5000, NULL, 10)
  

Или: связать сотрудника с отделом, который уже существует в таблице departement.

Комментарии:

1. Я уже это сделал. Извините, я не уточнил это ранее. Я отредактировал вопрос.

2. @iblue 95: если бы у вас уже был отдел 10 в таблице department, вы бы не получали эту ошибку.

Ответ №3:

ВНЕШНИЙ КЛЮЧ (Deptno) ССЫЛАЕТСЯ НА Emp (Empno) Является ли бессмысленным, предположительно, вы имели в виду отдел ССЫЛОК на ВНЕШНИЙ КЛЮЧ (Deptno) (deptno)