Как удалить из нескольких таблиц в 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 95

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]