Удаление строк из нескольких таблиц сразу

Я пытаюсь объединить 2 запроса в один, как это

$result=$db->query ("DELETE FROM menu WHERE name = '$new'") or die($db->error); $result=$db->query ("DELETE FROM pages WHERE title = 'new'") or die($db->error); 

В

 $result=$db->query ("DELETE FROM menu AS m, pages AS p WHERE m.name = 'new' AND p.title='new'") or die($db->error); 

Но DB дает синтаксическую ошибку. Что не так?

Вы наверняка можете удалить из нескольких таблиц в одном из операторов MySQL . Ваши требования будут работать с использованием следующего запроса:

 DELETE menu, pages FROM menu JOIN pages WHERE menu.name = 'some name' AND pages.title = 'some title' 

Или:

 DELETE FROM menu, pages USING menu JOIN pages WHERE menu.name = 'some name' AND pages.title = 'some title' 

Однако есть один улов с этими примерами: для этого необходимо существование обоих значений.

Должно быть больше способов получить желаемый результат, я думаю, без этого ограничения (используя другие типы JOIN я бы подумал), но я не смог понять, как это должно работать.

Если строки, которые вы хотите удалить, каким-то образом связаны друг с другом с помощью внешних ключей (и вы не используете ограничения внешнего ключа с таблицами InnoDB), это должно быть еще проще сделать, что вы хотите. Что-то вроде этого должно работать тогда:

 DELETE menu, pages FROM menu LEFT JOIN pages ON menu.pageId = page.id # using imagined columns here WHERE # this where clause might be redundant then menu.name = 'some name' AND pages.title = 'some title' 

Однако будьте осторожны с этими примерами. Сначала экспериментируйте с тестовой средой, так как я не уверен, что 100% точных последствий, если честно; Я просто хотел дать подсказку о том, что удаляется сразу несколько таблиц.

Операции DELETE должны выполняться по одной таблице за раз. Невозможно объединить их, как вы пытаетесь сделать. В зависимости от того, что вы пытаетесь выполнить, вы можете использовать транзакцию для двух операций.

Если таблицы связаны с внешним ключом, вы можете посмотреть в ON DELETE CASCADE . В основном, это то, что если вы удаляете строку, к которой привязаны другие таблицы, она также удаляет строки в связанных таблицах.

  • MySQL
  • PostgreSQL