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

Как удалить все строки из всех таблиц в mysql (в sql)

Я пишу несколько скриптов утилиты db, и одна из задач, которые мне нужно сделать, это только переустановить данные, но оставить схему цельной. Каков самый простой способ автоматизировать это из командной строки с помощью bash и инструментов mysql (без php и т.д.)?

Обновление: Я хотел бы, чтобы решение обрабатывало все таблицы в одной команде и, если возможно, не нуждалось в обновлении, если таблицы добавлены или удалены.

4b9b3361

Ответ 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

Измените действие, выполняемое по мере необходимости и с большим трепетом!