Подтвердить что ты не робот

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

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

Query:

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

Ответ 1

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

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

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

Ответ 2

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

Вы можете указать несколько таблиц в инструкции 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.

Ответ 3

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

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

Ответ 4

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

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

Конечно, это не так. Но вместо того, чтобы писать несколько заявлений (избыточных и неэффективных), используя объединения (трудные для новичков) или внешние ключи (что еще труднее для новичков и недоступно во всех двигателях или существующих наборах данных), вы можете упростить свой код с помощью 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);
}

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

Ответ 5

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

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

Ответ 6

Документация для 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]

Ответ 7

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

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

Ответ 8

Обычно вы не можете УДАЛИТЬ из нескольких таблиц одновременно, если только вы не будете использовать 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 - удалить/удалить все таблицы с определенным префиксом.

Ответ 9

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

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