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

Усечение всех таблиц в базе данных MySQL, которые соответствуют шаблону имени

Мне нужно очистить все мои таблицы инвентаря.

Я пробовал это:

SELECT 'TRUNCATE TABLE ' + TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'inventory%'

Но я получаю эту ошибку:

Truncated incorrect DOUBLE value: 'TRUNCATE TABLE ' Error Code 1292

если это правильный путь, то что я делаю неправильно?

4b9b3361

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