Удалить строки из нескольких таблиц в одном запросе - PullRequest
2 голосов
/ 17 августа 2011

Как правильно удалить строки из нескольких таблиц в одном запросе?

Причина, по которой я спрашиваю, заключается в том, что я делаю это с помощью PHP.Если я использую несколько запросов для удаления из каждой таблицы по одному, PHP должен сделать несколько поездок в базу данных.Повлияет ли это на производительность, если я воспользуюсь этим методом?

Мне известно о параметре ON DELETE CASCADE, но он работает не на каждом механизме хранения.Кроме того, могут возникнуть ситуации, когда я не хочу удалять все записи из дочерних таблиц при удалении родительской записи.

Ответы [ 3 ]

2 голосов
/ 17 августа 2011
DELETE
  t1, t2
FROM
  table1 AS t1 INNER JOIN table2 AS t2
ON
  joinCondition
WHERE
  whereCondition

Как обычно с запросами DELETE: будьте очень осторожны

Подробнее здесь: http://dev.mysql.com/doc/refman/5.5/en/delete.html

0 голосов
/ 27 августа 2011

Я тоже однажды столкнулся с подобной проблемой. Мое решение состояло в том, чтобы написать мой собственный минимально-рекурсивный запрос. Всего один запрос, и он сделает все остальное за вас. Вот как это происходит:

// основная функция

фабрика функций ($ db) {$ table = array ('table1', 'table2', 'table3' ...); // мой прошел весь путь до таблицы 12
for ($ i = 0; $ I < '' SizeOf ($ таблица); $ i ++) {
delete ($ db, $ table [$ i]);
}}

// удалить функцию .. можно также настроить ее с помощью заводской функции, но без сбоев 4

удалить ($ db, $ table) {

$ sql = 'удалить из'. $ Table; if ($ db-> query ($ sql)) {echo ucfirst ($ таблица). удалить завершено 100% ';

} * * тысяча двадцать-один

}

Вот и все ... чтобы заставить работать неназначенный массив вставок, создайте переменную для хранения размера массива со страницы ввода данных и измените удаление на оператор подготовки и вставки «вставить в таблицу». Надеюсь, это каким-то образом помогло вам * 1026

0 голосов
/ 17 августа 2011

Если вы не знаете ответ на этот вопрос, то вам не следует пытаться поддерживать многочисленные RDMS для вашего приложения.Ставить прямо.Опция CASCADE доступна в любом реляционном БД, который имеет значение.Кроме того, вы должны рассмотреть вопрос о том, как хранить иерархические данные, чтобы удалить дочерние записи.

Например, если вы пытаетесь удалить все «файлы» в «папке» при использовании модели вложенного набора, это будет просто вопрос

DELETE from files where id > :lft and id < :rgt

Но в любом случае вы все равно можете удалить из нескольких таблиц, используя JOIN delete.Тем не менее, this не поддерживается многими RDMS, поэтому, если вас беспокоит использование каскада, вы никогда не сможете использовать объединения-удаления для каждой базы данных, даже если вы используете DBAL.

Ответ

  • Используйте DBAL, например, Doctrine DBAL (не ORM), и используйте каскады, где это поддерживается.
  • Pickединую базу данных, и развивайте с тем, что вы знаете об этом.
...