У меня немного странная проблема. Я пытаюсь добавить внешний ключ в одну таблицу, которая ссылается на другую, но по какой-то причине он не работает. Из-за моего ограниченного знания 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
Ответы:
Вполне вероятно, что ваша
sourcecodes_tags
таблица содержитsourcecode_id
значения, которых больше нет в вашейsourcecodes
таблице. Вы должны сначала избавиться от них.Вот запрос, который может найти эти идентификаторы:
источник
UPDATE sourcecodes_tags SET sourcecode_id = NULL WHERE sourcecode_id NOT IN (SELECT id FROM sourcecodes)
должен помочь избавиться от этих идентификаторов. Или, еслиnull
это не разрешеноsourcecode_id
, удалите эти строки или добавьте отсутствующие значения вsourcecodes
таблицу.SELECT Tchild.id FROM Tchild INNER JOIN Tmain ON Tmain.id = Tchild.fk_id WHERE Tmain.id IS NULL
ничего не возвращается, поэтому проблема в другом месте!UPDATE `homestead`.`automations` SET `deleted_at`=NULL WHERE deleted_at IS NOT NULL;
, который вообще не включал внешний ключ, поэтому я был сбит с толку. Но тот факт, что в моей таблице контактов отсутствовали некоторые записи, на которые ссылалась таблица автоматизации, привел к появлению этого «кода ошибки: 1452. Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено».У меня была та же проблема с моей базой данных MySQL, но, наконец, я получил решение, которое сработало для меня.
Поскольку в моей таблице все было нормально с точки зрения mysql (обе таблицы должны использовать движок InnoDB, а тип данных каждого столбца должен быть одного типа, который принимает участие в ограничении внешнего ключа).
Единственное, что я сделал, - отключил проверку внешнего ключа, а затем включил ее после выполнения операции с внешним ключом.
Шаги, которые я предпринял:
источник
Используйте ,
NOT IN
чтобы найти , где ограничения сдерживая :Итак, более конкретно:
РЕДАКТИРОВАТЬ:
IN
иNOT IN
операторы, как известно, намного быстрее, чемJOIN
операторы, а также гораздо проще построить и повторить.источник
Обрежьте таблицы и попробуйте добавить ограничение FK .
Я знаю, что это решение немного неудобно, но оно работает на 100%. Но я согласен, что это не идеальное решение для решения проблемы, но я надеюсь, что это поможет.
источник
Для меня эта проблема была немного другой и супер легко проверить и решить.
Вы должны убедиться, что ОБА из ваших таблиц InnoDB. Если одна из таблиц, а именно справочная таблица, является MyISAM, ограничение не будет выполнено.
источник
Это также происходит при установке внешнего ключа для parent.id для child.column, если child.column уже имеет значение 0, а значение parent.id не равно 0
Вы должны убедиться, что каждый child.column имеет значение NULL или имеет значение, которое существует в parent.id
И теперь, когда я прочитал заявление, которое написал nos, это то, что он проверяет.
источник
У меня была такая же проблема сегодня. Я проверил четыре вещи, некоторые из которых уже упоминались здесь:
Есть ли какие-либо значения в вашем дочернем столбце, которых нет в родительском столбце (кроме NULL, если дочерний столбец обнуляется)
У дочерних и родительских столбцов одинаковый тип данных?
Есть ли индекс родительского столбца, на который вы ссылаетесь? MySQL, кажется, требует этого по соображениям производительности ( http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html )
И этот решил для меня: у обеих таблиц одинаковое сопоставление?
У меня был один стол в UTF-8, а другой в iso-что-то. Это не сработало. После изменения iso-таблицы на сопоставление UTF-8 ограничения могут быть добавлены без проблем. В моем случае phpMyAdmin даже не отображал дочернюю таблицу в iso-кодировке в раскрывающемся списке для создания ограничения внешнего ключа.
источник
Кажется, что для строки 0 столбца есть недопустимое значение, которое не является допустимым внешним ключом, поэтому MySQL не может установить для него ограничение внешнего ключа.
Вы можете выполнить следующие действия:
Удалите столбец, для которого вы пытались установить ограничение FK.
Добавьте его снова и установите его значение по умолчанию как NULL.
Попробуйте снова установить для него ограничение внешнего ключа.
источник
У меня была та же проблема, я проверил строки своих таблиц и обнаружил некоторую несовместимость со значением полей, которые я хотел определить для внешнего ключа. Я исправил это значение, попробовал еще раз, и проблема была решена.
источник
В итоге я удаляю все данные в моей таблице и снова запускаю alter. Оно работает. Не блестящий, но это сэкономит много времени, особенно ваше приложение все еще находится в стадии разработки без каких-либо данных о клиентах.
источник
попробуй это
источник
У меня была такая же проблема примерно три раза. В каждом случае это было потому, что одна (или более) из моих записей не соответствовала новому внешнему ключу. Возможно, вы захотите обновить существующие записи в соответствии с синтаксическими ограничениями внешнего ключа, прежде чем пытаться добавить сам ключ. Следующий пример должен обычно изолировать записи о проблемах:
повторите
AND (candidate key) <> (next proposed foreign key value)
в вашем запросе для каждого значения во внешнем ключе.Если у вас есть тонна записей, это может быть сложно, но если ваша таблица достаточно мала, это не займет много времени. Я не супер удивительный в синтаксисе SQL, но это всегда изолировало проблему для меня.
источник
Очистите данные обеих таблиц и выполните команду. Это сработает.
источник
Я получал эту ошибку при использовании Laravel и eloquent, попытка создать ссылку на внешний ключ привела бы к 1452. Проблема заключалась в нехватке данных в связанной таблице.
Пожалуйста, см. Здесь для примера: http://mstd.eu/index.php/2016/12/02/laravel-eloquent-integrity-constraint-violation-1452-foreign-key-constraint/
источник
Я готовил это решение, и этот пример может помочь.
В моей базе данных есть две таблицы (email и credit_card) с первичными ключами для их идентификаторов. Другая таблица (клиент) ссылается на идентификаторы этой таблицы как внешние ключи. У меня есть причина, чтобы иметь электронную почту отдельно от данных клиента.
Сначала я вставляю данные строки для ссылочных таблиц (электронная почта, credit_card), затем вы получаете идентификатор для каждой, эти идентификаторы необходимы в третьей таблице (клиент).
Если вы не вставите сначала строки в ссылочных таблицах, MySQL не сможет установить соответствия, когда вы вставите новую строку в третью таблицу, которая ссылается на внешние ключи.
Если сначала вставить ссылочные строки для ссылочных таблиц, то в строке, которая ссылается на внешние ключи, ошибки не возникает.
Надеюсь это поможет.
источник
Убедитесь, что значение находится в другой таблице, иначе вы получите эту ошибку в соответствующем соответствующем столбце.
Поэтому, если назначенный столбец присваивается идентификатору строки другой таблицы, убедитесь, что в таблице есть строка, в противном случае появится эта ошибка.
источник
Вы можете попробовать этот пример
Примечание: если вы используете phpmyadmin, просто снимите флажок Включить проверку внешнего ключа
как пример
надеюсь, что это решение решить вашу проблему :)
источник
Вам просто нужно ответить на один вопрос:
Ваша таблица уже хранит данные? (Особенно в таблицу включен внешний ключ.)
Если ответ «да», то единственное, что вам нужно сделать, это удалить все записи, тогда вы можете добавить любой внешний ключ в вашу таблицу.
Причина, по которой вы не можете добавить внешний ключ после ввода данных, связана с несогласованностью таблицы. Как вы собираетесь работать с новым внешним ключом в прежней таблице, заполненной данными?
Если ответ «нет», следуйте другим инструкциям.
источник
должен помочь избавиться от этих идентификаторов. Или, если
null
это не разрешеноsourcecode_id
, удалите эти строки или добавьте отсутствующие значения вsourcecodes
таблицу.источник
У меня была такая же проблема и я нашел решение, разместив
NULL
вместоNOT NULL
столбца внешнего ключа. Вот запрос:MySQL выполнил этот запрос!
источник
В моем случае я создал новую таблицу с той же структурой, создал отношения с другими таблицами, затем извлек данные в CSV из старой таблицы, в которой возникла проблема, затем импортировал CSV в новую таблицу и отключил проверку внешнего ключа. и отключил прерывание импорта, все мои данные были вставлены в новую таблицу, которая без проблем успешно, а затем удалил старую таблицу.
Это сработало для меня.
источник