Данные не могут быть добавлены в таблицу MySQL из-за нарушения ограничений внешнего ключа

#mysql #database

#mysql #База данных

Вопрос:

Данные не могут быть добавлены в таблицы из-за ОШИБКИ 1452 (23000). Как это можно решить?

 mysql> insert into lecturers (lecid, fname, lname) values (600, 'Brandon', 'Jenkins');

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`handin`.`lecturers`, CONSTRAINT `lecturers_ibfk_1` FOREIGN KEY (`unitid`) REFERENCES `unit` (`unitid`))

| Field  | Type        | Null | Key | Default | Extra |
 -------- ------------- ------ ----- --------- ------- 
| lecid  | int(11)     | NO   | PRI | NULL    |       |
| fname  | varchar(35) | NO   |     | NULL    |       |
| lname  | varchar(35) | NO   |     | NULL    |       |
| unitid | int(11)     | NO   | MUL | NULL    |       |
 -------- ------------- ------ ----- --------- ------- 
4 rows in set (0.00 sec)
  

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

1. Вопрос не был ясен.

Ответ №1:

Ограничение внешнего ключа обеспечивает «ссылочную целостность». Наряду с ограничением NOT NULL, ограничение внешнего ключа сообщает базе данных, что каждая строка в lecturers таблице должна ссылаться на строку в unit таблице.

Сообщение об ошибке указывает, что если оператор INSERT должен был добавить строку, добавленная строка нарушила бы это ограничение. ВСТАВКА запрещена, поскольку добавляемая строка нарушает ограничение.


Мы видим, что оператор INSERT не предоставляет значение для unitid столбца.

MySQL предоставит значение по умолчанию для unitid столбца — или — есть BEFORE INSERT триггер, который присваивает ему значение.

Мы видим unitid , что столбец объявлен равным NOT NULL , поэтому мы знаем NULL , что значение не присваивается. (Если бы присваивалось значение NULL, мы бы нарушали ограничение NOT NULL, и мы получили бы другое сообщение об ошибке.)

Ограничение внешнего ключа в основном сообщает базе данных… когда я добавляю или обновляю строку lecturers , проверьте unit таблицу и убедитесь, что значение, которое мы присваиваем unitid столбцу, существует в строке unit таблицы.

Сообщение об ошибке сообщает нам, что проверка не удалась. Значение, которое мы пытаемся присвоить unitid столбцу в lecturers , не найдено в unitid столбце unit таблицы.


MySQL запрещает вставку, поскольку строка нарушает указанное ограничение.

Это «то, что происходит».


Если вы хотите добавить строку в lecturers таблицу, укажите допустимое значение для unitid столбца…

  INSERT INTO lecturers (..., unitid) VALUES (...,'42')
 --                          ^^^^^^              ^^^^
  

Где предоставленное значение '42' находится в строке unit таблицы. То есть этот запрос вернул бы по крайней мере одну строку (обычно, только одну строку)…

  SELECT unitid FROM unit WHERE unitid = '42'