Mysql – удаление из нескольких таблиц одним запросом

У меня есть 4 таблицы, в которых хранится различная информация о пользователе в каждом. В каждой таблице есть поле с user_id, чтобы определить, какая строка принадлежит этому пользователю. Если я хочу удалить пользователя, это лучший способ удалить эту информацию из нескольких таблиц? Моя цель – сделать это в одном запросе.

Запрос:

"DELETE FROM table1 WHERE user_id='$user_id'; DELETE FROM table2 WHERE user_id='$user_id'; DELETE FROM table3 WHERE user_id='$user_id'; DELETE FROM table4 WHERE user_id='$user_id';"; 

9 Solutions collect form web for “Mysql – удаление из нескольких таблиц одним запросом”

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

Затем удаление записи из родительской таблицы удаляет записи из дочерних таблиц.

Проверьте эту ссылку: http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

Видимо, это возможно. Из руководства :

Вы можете указать несколько таблиц в инструкции DELETE для удаления строк из одной или нескольких таблиц в зависимости от конкретного условия в предложении WHERE. Однако вы не можете использовать ORDER BY или LIMIT в DELETE с несколькими таблицами. В предложении table_references перечислены таблицы, участвующие в объединении. Его синтаксис описан в разделе 12.2.8.1, «JOIN Syntax».

Пример в руководстве:

 DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id; 

должны применяться 1: 1.

Вы также можете использовать следующий запрос:

DELETE FROM Student, Enrollment USING Student INNER JOIN Enrollment ON Student.studentId = Enrollment.studentId WHERE Student.studentId= 51;

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

 DELETE FROM table1,table2,table3,table4 WHERE user_id='$user_id' 

Конечно, нет. Но вместо того, чтобы писать несколько заявлений (избыточных и неэффективных), используя объединения (трудные для новичков) или foreign keys (что еще труднее для новичков и недоступно для всех движков или существующих наборов данных), вы можете упростить свой код с помощью LOOP!

В качестве базового примера используется PHP (где $ db – ваш дескриптор соединения):

 $tables = array("table1","table2","table3","table4"); foreach($tables as $table) { $query = "DELETE FROM $table WHERE user_id='$user_id'"; mysqli_query($db,$query); } 

Надеюсь, это поможет кому-то!

Вы можете использовать следующий запрос для удаления строк из нескольких таблиц,

DELETE table1, table2, table3 FROM table1 INNER JOIN table2 INNER JOIN table3 WHERE table1.userid = table2.userid AND table2.userid = table3.userid AND table1.userid=3

из двух таблиц с внешним ключом вы можете попробовать этот запрос:

 DELETE T1, T2 FROM T1 INNER JOIN T2 ON T1.key = T2.key WHERE condition 

В документации для DELETE указан синтаксис нескольких таблиц.

 DELETE [LOW_PRIORITY] [QUICK] [IGNORE] tbl_name[.*] [, tbl_name[.*]] ... FROM table_references [WHERE where_condition] 

Или:

 DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name[.*] [, tbl_name[.*]] ... USING table_references [WHERE where_condition] 

Обычно вы не можете УДАЛИТЬ из нескольких таблиц одновременно, если только вы не будете использовать JOINs, как показано в других ответах.

Однако, если все ваши таблицы начинаются с определенного имени, тогда этот запрос будет генерировать запрос, который будет выполнять эту задачу:

 SELECT CONCAT('DELETE FROM ', GROUP_CONCAT(TABLE_NAME SEPARATOR ' WHERE user_id=123;DELETE FROM ') , 'FROM table1;' ) AS statement FROM information_schema.TABLES WHERE TABLE_NAME LIKE 'table%' 

затем передайте его (в оболочку) в команду mysql для выполнения.

Например, он будет генерировать что-то вроде:

 DELETE FROM table1 WHERE user_id=123; DELETE FROM table2 WHERE user_id=123; DELETE FROM table3 WHERE user_id=123; 

Более ориентированный на оболочку пример:

 echo "SHOW TABLES LIKE 'table%'" | mysql | tail -n +2 | xargs -L1 -I% echo "DELETE FROM % WHERE user_id=123;" | mysql -v 

Если вы хотите использовать для этого только MySQL, вы можете подумать о более расширенном запросе, например:

 SET @TABLES = (SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_NAME LIKE 'table%'); PREPARE drop_statement FROM 'DELETE FROM @tables'; EXECUTE drop_statement USING @TABLES; DEALLOCATE PREPARE drop_statement; 

Вышеприведенный пример основан на: MySQL – удалить / удалить все таблицы с определенным префиксом .

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

эта логика будет похожа на то, что вы написали.

  • Как изменить порт mysql
  • Объединить несколько дочерних строк в одну строку MYSQL
  • # 1273 - Неизвестная сортировка: 'utf8mb4_unicode_ci' Cpanel
  • Можете ли вы разбить / разбить поле в запросе MySQL?
  • Rails 3 ActiveRecord: порядок по количеству ассоциаций
  • Есть ли способ получить идентификатор автоинкремента из подготовленного оператора
  • Невозможно выполнить операции манипуляции данными с помощью executeQuery ()
  • Неверное строковое значение: '\ xF0 \ x9F \ x8E \ xB6 \ xF0 \ x9F ...' MySQL
  • Поиск MySQL в запятой
  • Использование ALTER для удаления столбца, если оно существует в MySQL
  • Как вставить много строк в таблицу MySQL и вернуть новые идентификаторы?
  • Interesting Posts

    Пример ковариации и контравариантности в реальном мире

    Сканирование classpath / modulepath во время выполнения в Java 9

    Две клавиатуры на одном компьютере. Когда я пишу с AI, хочу иметь раскладку клавиатуры в США, когда я использую BI, хочу шведский. Возможное?

    Как найти владельца Wi-Fi сети

    Android, Как преобразовать строку в Date?

    Какое другое приложение использует мою звуковую карту?

    Целочисленные объекты-оболочки имеют одни и те же экземпляры только в пределах значения 127?

    Максимальные размеры разметки окна после сеанса RDP

    SqlException из Entity Framework – новая транзакция не допускается, поскольку в сеансе есть другие streamи

    Сбор мусора по локальной переменной

    Алгоритм случайного генерирования эстетически приятной цветовой палитры

    .c vs .cc против .cpp vs .hpp vs .h vs .cxx

    Как подключить эмулятор Android к Интернету

    Получить ServletContext в ресурсе JAX-RS

    Как обновить коллекцию ресурсов REST

    Давайте будем гением компьютера.