Как очистить все строки из всех таблиц в MySQL (в SQL) - PullRequest
30 голосов
/ 18 января 2009

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

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

Ответы [ 4 ]

53 голосов
/ 18 января 2009
TRUNCATE tableName;

Это очистит содержимое таблицы.

Редактировать в ответ на Q edit: Из моего быстрого теста кажется, что вам придется выполнить как минимум 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]);
}
?>

Как минимум это требует некоторой обработки ошибок.

4 голосов
/ 18 января 2009

Если вы работаете в Unix / Linux, вы можете использовать оболочку для запуска:

mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP | mysql -u[USERNAME] -p[PASSWORD] [DATABASE]

Или в Rational Relational есть блог пост о том, как написать хранимую процедуру для этого.

1 голос
/ 18 января 2009

Вот одна строка 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

Обратите внимание, что усечение удалит все данные из целевых таблиц без каких-либо запросов. Возможно, сначала измените «truncate $ i» на «description $ 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

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

0 голосов
/ 07 марта 2011

Для людей, которые хотят сделать это через phpMyAdmin, взгляните на этот вопрос:

Как удалить содержимое всех таблиц в моей базе данных в phpMyAdmin без удаления базы данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...