Mysql ошибка 1452 - Не удается добавить или обновить дочернюю строку: ограничение внешнего ключа не удается - PullRequest
232 голосов
/ 10 августа 2009

У меня странная проблема. Я пытаюсь добавить внешний ключ в одну таблицу, которая ссылается на другую, но по какой-то причине он не работает. Из-за моего ограниченного знания MySQL единственное, что может быть подозрительным, это то, что в другой таблице есть внешний ключ, ссылающийся на тот, на который я пытаюсь ссылаться.

Я выполнил запрос SHOW CREATE TABLE для обеих таблиц, sourcecodes_tags - это таблица с внешним ключом, sourcecodes - это ссылочная таблица.

CREATE TABLE `sourcecodes` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `user_id` int(11) unsigned NOT NULL,
 `language_id` int(11) unsigned NOT NULL,
 `category_id` int(11) unsigned NOT NULL,
 `title` varchar(40) CHARACTER SET utf8 NOT NULL,
 `description` text CHARACTER SET utf8 NOT NULL,
 `views` int(11) unsigned NOT NULL,
 `downloads` int(11) unsigned NOT NULL,
 `time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`),
 KEY `user_id` (`user_id`),
 KEY `language_id` (`language_id`),
 KEY `category_id` (`category_id`),
 CONSTRAINT `sourcecodes_ibfk_3` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `sourcecodes_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `sourcecodes_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

CREATE TABLE `sourcecodes_tags` (
 `sourcecode_id` int(11) unsigned NOT NULL,
 `tag_id` int(11) unsigned NOT NULL,
 KEY `sourcecode_id` (`sourcecode_id`),
 KEY `tag_id` (`tag_id`),
 CONSTRAINT `sourcecodes_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Это код, который генерирует ошибку:

ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE

Ответы [ 20 ]

4 голосов
/ 09 января 2012

В итоге я удаляю все данные в моей таблице и снова запускаю alter. Оно работает. Не блестящий, но это сэкономит много времени, особенно ваше приложение все еще находится в стадии разработки без каких-либо данных о клиентах.

2 голосов
/ 28 августа 2012

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

SELECT * FROM (tablename)
    WHERE (candidate key) <> (proposed foreign key value) 
        AND (candidate key) <> (next proposed foreign key value)

повтор AND (candidate key) <> (next proposed foreign key value) в вашем запросе для каждого значения во внешнем ключе.

Если у вас есть тонна записей, это может быть сложно, но если ваша таблица достаточно мала, это не должно занять слишком много времени. Я не супер удивительный в синтаксисе SQL, но это всегда изолировало проблему для меня.

2 голосов
/ 23 апреля 2015

Очистите данные обеих таблиц и выполните команду. Это будет работать.

2 голосов
/ 02 декабря 2016

Я получал эту ошибку при использовании Laravel и eloquent, попытка создать ссылку на внешний ключ может привести к 1452. Проблема заключалась в нехватке данных в связанной таблице.

Пожалуйста, посмотрите здесь пример: http://mstd.eu/index.php/2016/12/02/laravel-eloquent-integrity-constraint-violation-1452-foreign-key-constraint/

1 голос
/ 13 сентября 2018

Вы можете попробовать этот пример

 START TRANSACTION;
 SET foreign_key_checks = 0;
 ALTER TABLE `job_definers` ADD CONSTRAINT `job_cities_foreign` FOREIGN KEY 
 (`job_cities`) REFERENCES `drop_down_lists`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
 SET foreign_key_checks = 1;
 COMMIT;

Примечание: если вы используете phpmyadmin, просто снимите флажок Включить проверки внешнего ключа

как пример enter image description here

надеюсь, что это решение решит вашу проблему:)

1 голос
/ 03 января 2018

Убедитесь, что значение находится в другой таблице, в противном случае вы получите эту ошибку в соответствующем соответствующем столбце.

Таким образом, если назначенный столбец присваивается идентификатору строки другой таблицы, убедитесь, что в таблице есть строка, в противном случае появится эта ошибка.

1 голос
/ 26 апреля 2015

Вам просто нужно ответить на один вопрос:

Ваша таблица уже хранит данные? (Особенно в таблицу включен внешний ключ.)

Если ответ да, то единственное, что вам нужно сделать, это удалить все записи, тогда вы можете добавить любой внешний ключ к вашей таблице.

Удалить инструкцию: от дочерней (которая включает в себя таблицу внешнего ключа) до родительской таблицы.

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

Если ответ отрицательный, следуйте другим инструкциям.

1 голос
/ 16 марта 2016

Я готовил это решение, и этот пример может помочь.

В моей базе данных есть две таблицы (email и credit_card) с первичными ключами для их идентификаторов. Другая таблица (клиент) ссылается на идентификаторы этой таблицы как внешние ключи. У меня есть причина, чтобы электронная почта была отделена от данных клиента.

Сначала я вставляю данные строки для ссылочных таблиц (email, credit_card), затем вы получаете идентификатор для каждой, эти идентификаторы необходимы в третьей таблице (клиент).

Если вы не вставите сначала строки в ссылочных таблицах, MySQL не сможет установить соответствия, когда вы вставите новую строку в третью таблицу, которая ссылается на внешние ключи.

Если сначала вставить ссылочные строки для ссылочных таблиц, то в строке, которая ссылается на внешние ключи, ошибки не возникает.

Надеюсь, это поможет.

0 голосов
/ 31 января 2017

У меня была та же проблема, и я нашел решение, поместив NULL вместо NOT NULL в столбец внешнего ключа. Вот запрос:

ALTER TABLE `db`.`table1`
ADD COLUMN `col_table2_fk` INT UNSIGNED NULL,
ADD INDEX `col_table2_fk_idx` (`col_table2_fk` ASC),
ADD CONSTRAINT `col_table2_fk1`
FOREIGN KEY (`col_table2_fk`)
REFERENCES `db`.`table2` (`table2_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

MySQL выполнил этот запрос!

0 голосов
/ 23 февраля 2016
UPDATE sourcecodes_tags
SET sourcecode_id = NULL
WHERE sourcecode_id NOT IN (
  SELECT id FROM sourcecodes);

должно помочь избавиться от этих идентификаторов. Или, если null не разрешено в sourcecode_id, удалите эти строки или добавьте пропущенные значения в таблицу sourcecodes.

...