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';"; 

Вы можете определить ограничения внешнего ключа для таблиц с опцией 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 Вставить, если не существует иное обновление
  • Какой ORM я должен использовать для Node.js и MySQL?
  • выбор уникальных значений из столбца
  • Помогло бы добавить индекс в столбец BIGINT в MySQL?
  • MySQL, проверьте, существует ли столбец в таблице с SQL
  • Что такое mysql error 1025 (HY000): ошибка при переименовании './foo' (errno: 150) означает?
  • Как использовать DATETIME как DATE в mysql?
  • Максимальная длина MySQL и GROUP_CONCAT ()
  • Экспорт MySQL в outfile: CSV экранирование символов
  • Многоуровневый внешний ключ в MySQL?
  • Сравните две базы данных MySQL
  • Давайте будем гением компьютера.