#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)