При выполнении:
DELETE FROM `jobs` WHERE `job_id` =1 LIMIT 1
Это ошибки:
#1451 - Cannot delete or update a parent row: a foreign key constraint fails
(paymesomething.advertisers, CONSTRAINT advertisers_ibfk_1 FOREIGN KEY
(advertiser_id) REFERENCES jobs (advertiser_id))
Вот мои таблицы:
CREATE TABLE IF NOT EXISTS `advertisers` (
`advertiser_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`password` char(32) NOT NULL,
`email` varchar(128) NOT NULL,
`address` varchar(255) NOT NULL,
`phone` varchar(255) NOT NULL,
`fax` varchar(255) NOT NULL,
`session_token` char(30) NOT NULL,
PRIMARY KEY (`advertiser_id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
INSERT INTO `advertisers` (`advertiser_id`, `name`, `password`, `email`, `address`, `phone`, `fax`, `session_token`) VALUES
(1, 'TEST COMPANY', '', '', '', '', '', '');
CREATE TABLE IF NOT EXISTS `jobs` (
`job_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`advertiser_id` int(11) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
`shortdesc` varchar(255) NOT NULL,
`longdesc` text NOT NULL,
`address` varchar(255) NOT NULL,
`time_added` int(11) NOT NULL,
`active` tinyint(1) NOT NULL,
`moderated` tinyint(1) NOT NULL,
PRIMARY KEY (`job_id`),
KEY `advertiser_id` (`advertiser_id`,`active`,`moderated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
INSERT INTO `jobs` (`job_id`, `advertiser_id`, `name`, `shortdesc`, `longdesc`, `address`, `active`, `moderated`) VALUES
(1, 1, 'TEST', 'TESTTEST', 'TESTTESTES', '', 0, 0);
ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`);
Простой способ - отключить проверку внешнего ключа; внесите изменения и снова включите проверку внешнего ключа.
источник
REPLACE INTO tab_with_constraint ...
В соответствии с вашим текущим (возможно, некорректным) дизайном вы должны удалить строку из таблицы рекламодателей, прежде чем сможете удалить строку в таблице заданий, на которую она ссылается.
Кроме того, вы можете настроить внешний ключ так, чтобы удаление в родительской таблице приводило к автоматическому удалению строк в дочерних таблицах. Это называется каскадным удалением. Это выглядит примерно так:
Сказав, что, как уже отмечали другие, ваш внешний ключ должен выглядеть наоборот, поскольку таблица рекламодателей действительно содержит первичный ключ, а таблица заданий содержит внешний ключ. Я бы переписал это так:
И каскадное удаление не понадобится.
источник
Если вы хотите удалить таблицу, вы должны выполнить следующий запрос за один шаг
SET FOREIGN_KEY_CHECKS = 0; DROP TABLE table_name;
источник
Я попробовал решение, упомянутое @Alino Manzi, но оно не сработало для меня в таблицах, связанных с WordPress, используя wpdb.
Затем я изменил код, как показано ниже, и он работал
источник
Я думаю, что ваш внешний ключ задом наперед. Пытаться:
источник
Если у одного и того же рекламодателя несколько вакансий, то ваш внешний ключ должен быть:
В противном случае (если в вашем случае все наоборот), если вы хотите, чтобы строки в рекламодателе автоматически удалялись, если строка в задании удаляется, добавьте параметр «ON DELETE CASCADE» в конец внешнего ключа:
Проверьте ограничения внешнего ключа
источник
Вы должны удалить его по порядку. В таблицах есть зависимости
источник
Когда вы создаете базу данных или создаете таблицы
Вы должны добавить эту строку вверху сценария создания базы данных или таблицы
Теперь вы хотите удалить записи из таблицы? тогда ты пишешь как
Удачи!
источник
Как насчет этой альтернативы, которую я использовал: позвольте внешнему ключу быть NULL, а затем выберите ON DELETE SET NULL .
Лично я предпочитаю использовать как " ON UPDATE CASCADE ", так и " ON DELETE SET NULL ", чтобы избежать ненужных осложнений, но при настройке вы можете захотеть другой подход. Кроме того, значения внешнего ключа, равные NULL, могут впоследствии привести к осложнениям, поскольку вы не будете знать, что именно там произошло. Таким образом, это изменение должно быть тесно связано с тем, как работает код вашего приложения.
Надеюсь это поможет.
источник
Я имел эту проблему в миграции Laravel слишком
ПОРЯДКОВЫЙ капельные таблиц в пуха () метод имеет значения
может не работать, но если вы измените порядок, это работает.
источник
если вам нужно как можно скорее поддержать клиента и не иметь доступа к
так что целостность данных может быть отключена:
1) удалить внешний ключ
2) активировать операцию удаления через sql или api
3) добавить внешний ключ обратно в схему
однако это исправление, поэтому вы на свой страх и риск, потому что основной недостаток такого подхода заключается в том, что впоследствии необходимо сохранить целостность данных вручную.
источник
Вы можете создать триггер, чтобы удалить указанные строки перед удалением задания.
источник
Основная проблема с этим erorr
Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails
заключается в том, что он не сообщает , в какой таблице содержится ошибка FK, поэтому конфликт трудно разрешить.Если вы используете MySQL или аналогичный, я обнаружил, что вы можете создать диаграмму ER для вашей базы данных, а затем вы можете просмотреть и безопасно удалить любые конфликты, вызывающие ошибку.
connection
database
иtables
что нужно изучитьисточник
По сути, причина такого типа ошибок заключается в том, что в конечном итоге вы пытаетесь удалить набор, имеющий первичный ключ (корневую таблицу), и этот первичный ключ используется в дочерней таблице как внешний ключ. В этом случае для удаления данных родительской таблицы необходимо удалить данные дочерней таблицы (в которой используется внешний ключ). Спасибо
источник
Это также случилось со мной, и из-за зависимости и ссылки из других таблиц я не смог удалить запись. Я добавил столбец удаления (типа boolean) в таблицу. Значение в этом поле показывает, помечен ли элемент для удаления или нет. Если помечено для удаления, не извлекать / использовать; в противном случае, используйте его.
источник
Может быть, вам стоит попробовать УДАЛИТЬ КАСКАД
источник