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';";
Ответы
Ответ 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
обычно, я ожидал бы это как "каскадное удаление",
принудительно в триггере, вам нужно будет только удалить основную запись, тогда все депеппентные записи будут удалены логикой триггера.
эта логика будет похожа на то, что вы написали.