Как удалить из нескольких таблиц в MySQL?
Я пытаюсь удалить из нескольких таблиц одновременно. Я сделал немного исследований, и придумал это
DELETE FROM `pets` p,
`pets_activities` pa
WHERE p.`order` > :order
AND p.`pet_id` = :pet_id
AND pa.`id` = p.`pet_id`
однако, я получаю эту ошибку
Uncaught Database_Exception [ 1064]: у вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MySQL для правильного синтаксиса для использования рядом 'p,
pets_activities
па...
Я никогда раньше не удалял перекрестную таблицу, поэтому я неопытен и застрял сейчас же!
что я делаю не так?
6 ответов:
использовать
JOIN
наDELETE
заявление.DELETE p, pa FROM pets p JOIN pets_activities pa ON pa.id = p.pet_id WHERE p.order > :order AND p.pet_id = :pet_id
в качестве альтернативы вы можете использовать...
DELETE pa FROM pets_activities pa JOIN pets p ON pa.id = p.pet_id WHERE p.order > :order AND p.pet_id = :pet_id
... удалить только из pets_activities
см.http://dev.mysql.com/doc/refman/5.0/en/delete.html
для одиночных удалений таблицы, но с ссылочной целостностью, есть другие способы сделать с EXISTS, NOT EXISTS, IN, NOT IN и т. д. Но тот, что выше, где вы указываете, из каких таблиц удалять с помощью псевдоним перед предложением FROM может вытащить вас из нескольких довольно трудных мест более легко. Я склонен обращаться к существующему в 99% случаев, а затем есть 1%, где этот синтаксис MySQL занимает день.
так как это, кажется, простой родитель / ребенок отношения между
pets
иpets_activities
, вам было бы лучше создать ограничение внешнего ключа с удалением каскада.таким образом, когда a
pets
строка удаляется, тоpets_activities
строки, связанные с ним, также автоматически удаляются.тогда ваш запрос становится простым:
delete from `pets` where `order` > :order and `pet_id` = :pet_id
использовать
DELETE FROM `articles`, `comments` USING `articles`,`comments` WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4
или
DELETE `articles`, `comments` FROM `articles`, `comments` WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4
синтаксис выглядит правильно для меня ... попробуйте изменить его, чтобы использовать внутреннее соединение ...
взгляните на это: http://www.electrictoolbox.com/article/mysql/cross-table-delete/
У меня нет базы данных mysql для тестирования на данный момент, но вы пытались указать, что удалить до предложения from? Например:
DELETE p, pa FROM `pets` p, `pets_activities` pa WHERE p.`order` > :order AND p.`pet_id` = :pet_id AND pa.`id` = p.`pet_id`
Я думаю, что синтаксис, который вы использовали, ограничен более новыми версиями mysql.
для тех, кто читает это в 2017 году, это, как я сделал что-то подобное.
DELETE pets, pets_activities FROM pets inner join pets_activities on pets_activities.id = pets.id WHERE pets.`order` > :order AND pets.`pet_id` = :pet_id
Как правило, для удаления строк из нескольких таблиц ниже приведен синтаксис, которому я следую. Решение основано на предположении, что существует некоторая связь между двумя таблицами.
DELETE table1, table2 FROM table1 inner join table2 on table2.id = table1.id WHERE [conditions]