Как удалить все строки из всех таблиц в mysql (в sql)
Я пишу несколько скриптов утилиты db, и одна из задач, которые мне нужно сделать, это только переустановить данные, но оставить схему цельной. Каков самый простой способ автоматизировать это из командной строки с помощью bash и инструментов mysql (без php и т.д.)?
Обновление:
Я хотел бы, чтобы решение обрабатывало все таблицы в одной команде и, если возможно, не нуждалось в обновлении, если таблицы добавлены или удалены.
Ответы
Ответ 1
TRUNCATE tableName;
Это опустошит содержимое таблицы.
Изменить в ответ на изменение Q:
По моему быстрому тесту кажется, что вам нужно будет выполнить как минимум 2 запроса, поскольку кажется, что "показать таблицы" нельзя использовать в качестве подзапроса, я не знаю, как это сделать в bash, так что вот PHP пример, надеюсь, это поможет.
<?php
mysql_connect('localhost', 'user', 'password');
$dbName = "database";
mysql_select_db($dbName); /*added semi-colon*/
$result_t = mysql_query("SHOW TABLES");
while($row = mysql_fetch_assoc($result_t))
{
mysql_query("TRUNCATE " . $row['Tables_in_' . $dbName]);
}
?>
Как минимум, это требует некоторой обработки ошибок.
Ответ 2
Если вы используете unix/linux, вы можете использовать оболочку для запуска:
mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP | mysql -u[USERNAME] -p[PASSWORD] [DATABASE]
Или у Rational Relational есть blog сообщение о том, как писать хранимую процедуру для этого.
Ответ 3
Здесь BASH однострочный, чтобы обрезать все таблицы из списка баз данных:
for j in database_name1 database_name2; \
do for i in `echo 'show tables ' |mysql $j \
|grep -v 'Tables_in'`; do mysql $j -e "truncate $i"; done; done
Обратите внимание, что усечение приведет к удалению всех данных из целевых таблиц без каких-либо подсказок. Возможно, сначала измените "обрезать $i", чтобы "описать $i", чтобы убедиться, что таблицы в результирующем наборе предназначены для опустошения.
Еще одна вещь: если вы хотите перебирать каждую таблицу во всех базах MySQL (за исключением information_schema
и mysql
, я бы надеюсь!), замените приведенное выше "database_name1 database_name2" следующим:
`echo 'show databases' | mysql | awk '$1 != "information_schema" && \
$1 != "mysql" {if (NR > 1) {print}}'`
Итак, вот образец, который менее разрушительный; он выполняет OPTIMIZE для всех таблиц в каждой базе данных MySQL (исключения, как указано выше):
for j in `echo 'show databases' | mysql | \
awk '$1 != "information_schema" && $1 != \
"mysql" {if (NR > 1) {print}}'`; do for i in \
`echo 'show tables ' |mysql $j |grep -v \
'Tables_in'`; do mysql -e "optimize table $j.$i"; \
done; done
Измените действие, выполняемое по мере необходимости и с большим трепетом!
Ответ 4
Для людей, которые хотят это сделать через phpMyAdmin, посмотрите на этот вопрос:
Как удалить содержимое всех таблиц в моей базе данных В phpMyAdmin без удаления базы данных?