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