Усечение всех таблиц в базе данных MySQL, которые соответствуют шаблону имени
Мне нужно очистить все мои таблицы инвентаря.
Я пробовал это:
SELECT 'TRUNCATE TABLE ' + TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'inventory%'
Но я получаю эту ошибку:
Truncated incorrect DOUBLE value: 'TRUNCATE TABLE ' Error Code 1292
если это правильный путь, то что я делаю неправильно?
Ответы
Ответ 1
Использовать concat:
SELECT concat('TRUNCATE TABLE `', TABLE_NAME, '`;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'inventory%'
Это, конечно же, будет генерировать SQL, который вам нужно скопировать и запустить самостоятельно.
Ответ 2
Я знаю это более старое сообщение, но, возможно, следующий пример полезен для тех, кому необходимо усечь несколько таблиц из командной строки linux или из оболочки script:
mysql -p<secret> --execute="SELECT concat('TRUNCATE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '<database>' AND FIND_IN_SET(TABLE_NAME,'your_table_a,your_table_b,your_table_c')" | sed 1d | mysql -p<secret> <database>
Учитывая, что вам нужно заменить строки в скобках своими собственными значениями, он работал у меня. Также замените "your_table_a, your_table_b, your_table_c" разделенным запятыми списком ваших таблиц.;)
Ответ 3
SELECT 'SET FOREIGN_KEY_CHECKS = 0;'
UNION
SELECT DISTINCT concat( "TRUNCATE TABLE ", TABLE_NAME, ";" )
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'mydbname'
UNION
SELECT 'SET FOREIGN_KEY_CHECKS = 1;'
Ответ 4
Если вы используете командную строку, вы можете попробовать что-то вроде этого.
mysql -u [user] -p[password] -e 'use [database]; show tables' | perl -lane 'print "truncate table $F[0]" if /^inventory/i' > [database].sql
Ответ 5
Ниже приведено небольшое улучшение в приведенной выше инструкции SQL.
SELECT DISTINCT concat("TRUNCATE TABLE ", TABLE_NAME, ";")
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE "cache%"
Обратите внимание на команду DISTINCT в начале. Это приведет к тому, что результат SELECT будет показан только после таблиц, соответствующих вашим критериям LIKE.
Ответ 6
Если на вашем сервере имеется несколько баз данных, вы можете также указать db.
например. для очистки таблиц кэша Drupal
SELECT DISTINCT CONCAT(
"TRUNCATE TABLE ",
TABLE_SCHEMA,
".",
TABLE_NAME,
";" )
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE "cache_%"
AND TABLE_SCHEMA = 'dbname';
В результате получается sql как...
TRUNCATE TABLE dbname.cache_admin_menu;
TRUNCATE TABLE dbname.cache_block;
etc.
Предоставляя два преимущества,
- Вы можете запустить этот sql везде, независимо от выбранного в данный момент
базы данных.
- Вы будете уверены, что вы обрезаете таблицы на
правильная база данных.
См. ответ @falperez, если проверки внешнего ключа мешают вашему массовому усечению (хотя, конечно, они не будут очищать кэш drupal)
Ответ 7
SELECT CONCAT('TRUNCATE TABLE ',TABLE_NAME)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'inventory%'
Затем вы должны взять каждую строку результирующего набора и вызвать его как оператор SQL. Вы можете сделать это, выполнив и вставив отделенные результаты в окно команд.
Но гораздо лучшее решение - написать какую-нибудь программу, которая сделает запрос выше, и проверит результаты и сделает каждый запрос.
Используйте PHP для этого или любого другого языка сценариев. Многие примеры даже здесь на SO.
Ответ 8
Попробуйте этот оператор, он даст вам одну строку всех таблиц, и вы можете скопировать эти инструкции и выполнить для выполнения всех:
SELECT DISTINCT REPLACE(GROUP_CONCAT("TRUNCATE TABLE ", TABLE_NAME, ";"), ',', '')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE "cache%";
Ответ 9
SELECT REPLACE(GROUP_CONCAT("TRUNCATE TABLE ", TABLE_NAME, ";"), ',', '')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME LIKE "cache%";
Это основано на ответе AshwinP. Мне пришлось удалить DISTINCT и добавить WHERE TABLE_SCHEMA = DATABASE(), чтобы он работал у меня.
Команда не обрезает таблицы, а возвращает однострочный. Скопируйте и вставьте однострочный вкладыш в клиент mysql.
Ответ 10
очень хороший пример генерации и выполнения операторов USING concat Я только что прочитал минуту назад:
http://www.mysqltutorial.org/mysql-drop-table
-- set table schema and pattern matching for tables
SET @schema = 'classicmodels';
SET @pattern = 'test%';
-- build dynamic sql (DROP TABLE tbl1, tbl2...;)
SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(@schema,'.',table_name)),';')
INTO @droplike FROM information_schema.tables WHERE @schema = database()
AND table_name LIKE @pattern;
-- display the dynamic sql statement
SELECT @droplike;
-- execute dynamic sql
PREPARE stmt FROM @dropcmd;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;