Как удалить из нескольких таблиц в MySQL? - PullRequest
105 голосов
/ 26 июля 2010

Я пытаюсь удалить несколько таблиц одновременно. Я провел небольшое исследование и придумал это

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 pa ...

Я никогда раньше не удалял кросс-таблицы, поэтому я неопытен и застрял на данный момент!

Что я делаю не так?

Ответы [ 6 ]

188 голосов
/ 12 июля 2012

Используйте 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, вам будет легче выйти из нескольких довольно узких мест.Я склонен обращаться к EXISTS в 99% случаев, а затем есть 1%, где этот синтаксис MySQL занимает день.

19 голосов
/ 26 июля 2010

Поскольку это, кажется, простое отношение родитель / потомок между pets и pets_activities, было бы лучше создать ограничение внешнего ключа с помощью каскада удаления.

Таким образом, когда pets строка удаляется, pets_activities строки, связанные с ней, также автоматически удаляются.

Тогда ваш запрос становится простым:

delete from `pets`
    where `order` > :order
      and `pet_id` = :pet_id
13 голосов
/ 20 февраля 2015

Используйте это

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
2 голосов
/ 26 июля 2010

У меня нет базы данных 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.

2 голосов
/ 26 июля 2010

Синтаксис выглядит мне правильно ... попробуйте изменить его, чтобы использовать INNER JOIN ...

Посмотрите на это: http://www.electrictoolbox.com/article/mysql/cross-table-delete/

1 голос
/ 23 октября 2017

Для любого, кто читает это в 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]
...