Обрезать все таблицы в базе данных MySQL одной командой? - PullRequest
316 голосов
/ 16 декабря 2009

Существует ли запрос (команда) для усечения всех таблиц в базе данных за одну операцию? Я хочу знать, смогу ли я сделать это с помощью одного запроса.

Ответы [ 24 ]

321 голосов
/ 18 января 2012

Отбрасывание (то есть удаление таблиц)

mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "drop table $table" DATABASE_NAME; done

Усечение (то есть пустые таблицы)

mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "truncate table $table" DATABASE_NAME; done
128 голосов
/ 19 июля 2013

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

SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
FROM INFORMATION_SCHEMA.TABLES where  table_schema in ('db1_name','db2_name');

Использование результата запроса для усечения таблиц

Примечание: может быть, вы получите эту ошибку:

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

Это происходит, если есть таблицы с ссылками на внешние ключи к таблице, которую вы пытаетесь удалить / усечь.

Перед усечением таблиц Все, что вам нужно сделать, это:

SET FOREIGN_KEY_CHECKS=0;

Обрежьте свои таблицы и измените их обратно на

SET FOREIGN_KEY_CHECKS=1;
62 голосов
/ 20 августа 2011

Используйте phpMyAdmin следующим образом:

Просмотр базы данных => Отметить все (таблицы) => Пусто

Если вы хотите игнорировать проверки внешнего ключа, вы можете снять флажок с надписью:

[] Включить проверку внешнего ключа

Вам нужно будет запустить как минимум версию 4.5.0 или выше, чтобы установить этот флажок.

Это не MySQL CLI-fu, но эй, это работает!

23 голосов
/ 16 декабря 2009

MS SQL Server 2005+ (Удалить PRINT для фактического выполнения ...)

EXEC sp_MSforeachtable 'PRINT ''TRUNCATE TABLE ?'''

Если ваша платформа базы данных поддерживает представления INFORMATION_SCHEMA, возьмите результаты следующего запроса и выполните их.

SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

Попробуйте это для MySQL:

SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES

Добавление точки с запятой в Concat упрощает использование, например. из верстак MySQL.

SELECT Concat('TRUNCATE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES
18 голосов
/ 12 ноября 2011

Я нашел это, чтобы отбросить все таблицы в базе данных:

mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | mysql -uUSERNAME -pPASSWORD DATABASENAME

Полезно, если вы ограничены хостингом (не можете удалить всю базу данных).

Я изменил его, чтобы обрезать таблицы. Для mysqldump нет таблицы «--add-truncate-table», поэтому я сделал:

mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | sed -e 's/DROP TABLE IF EXISTS/TRUNCATE TABLE/g' | mysql -uUSERNAME -pPASSWORD DATABASENAME

у меня работает --edit, исправление опечатки в последней команде

13 голосов
/ 30 октября 2017
SET FOREIGN_KEY_CHECKS = 0;

SELECT @str := CONCAT('TRUNCATE TABLE ', table_schema, '.', table_name, ';')
FROM   information_schema.tables
WHERE  table_type   = 'BASE TABLE'
  AND  table_schema IN ('db1_name','db2_name');

PREPARE stmt FROM @str;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

SET FOREIGN_KEY_CHECKS = 1;
11 голосов
/ 07 ноября 2014

Мне показалось, что проще всего сделать что-то вроде приведенного ниже кода, просто заменить имена таблиц своими собственными. важно убедитесь, что последняя строка всегда SET FOREIGN_KEY_CHECKS = 1;

SET FOREIGN_KEY_CHECKS=0;
TRUNCATE `table1`;
TRUNCATE `table2`;
TRUNCATE `table3`;
TRUNCATE `table4`;
TRUNCATE `table5`;
TRUNCATE `table6`;
TRUNCATE `table7`;
SET FOREIGN_KEY_CHECKS=1;
11 голосов
/ 17 марта 2015

Будет напечатана команда для усечения всех таблиц:

SELECT GROUP_CONCAT(Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME) SEPARATOR ';') FROM INFORMATION_SCHEMA.TABLES where table_schema in ('my_db');
5 голосов
/ 23 сентября 2012
  1. Чтобы усечь таблицу, необходимо удалить ограничения внешнего ключа, сопоставленные со столбцами в этой таблице, из других таблиц (фактически для всех таблиц в конкретной БД / Схеме).
  2. Таким образом, все ограничения внешнего ключа должны быть сначала удалены, после чего следует усечение таблицы.
  3. Дополнительно, используйте таблицу оптимизации (в mysql, innodb engine esp), чтобы вернуть используемое пространство / размер данных в ОС после усечения данных.
  4. После выполнения усечения данных снова создайте те же ограничения внешнего ключа для той же таблицы. Ниже приведен скрипт, который будет генерировать скрипт для выполнения вышеуказанных операций.

    SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,';') FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_TYPE='FOREIGN KEY' AND TABLE_SCHEMA='<TABLE SCHEMA>'
    UNION
    SELECT CONCAT('TRUNCATE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
    UNION
    SELECT CONCAT('OPTIMIZE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
    UNION
    SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' ADD CONSTRAINT ',CONSTRAINT_NAME,' FOREIGN KEY(',COLUMN_NAME,')',' REFERENCES ',REFERENCED_TABLE_NAME,'(',REFERENCED_COLUMN_NAME,');') FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE CONSTRAINT_NAME LIKE 'FK%' AND TABLE_SCHEMA='<TABLE SCHEMA>'
    INTO OUTFILE "C:/DB Truncate.sql" LINES TERMINATED BY '\n';
    

Теперь запустите сгенерированный сценарий Db Truncate.sql

Преимущества. 1) Восстановить дисковое пространство 2) Нет необходимости отбрасывать и воссоздавать БД / схему с такой же структурой

Недостатки. 1) Ограничения FK должны быть именами в таблице с именем, содержащим «FK» в имени ограничения.

3 голосов
/ 16 декабря 2009

при использовании sql server 2005 существует скрытая хранимая процедура, которая позволяет вам выполнить команду или набор команд для всех таблиц в базе данных. Вот как бы вы вызывали TRUNCATE TABLE с помощью этой хранимой процедуры:

EXEC [sp_MSforeachtable] @command1="TRUNCATE TABLE ?"

Здесь - хорошая статья, которая развивается дальше.

Однако для MySql вы можете использовать mysqldump и указать опции --add-drop-tables и --no-data для удаления и создания всех таблиц без учета данных. как это:

mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE]

mysqldump руководство по использованию от dev.mysql

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