截断MySQL数据库中与名称模式匹配的所有表

Lui*_*cio 34 mysql sql

我需要清除所有库存表.

我试过这个:

SELECT 'TRUNCATE TABLE ' + TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'inventory%'
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

Truncated incorrect DOUBLE value: 'TRUNCATE TABLE ' Error Code 1292
Run Code Online (Sandbox Code Playgroud)

如果这是正确的方法,那么我做错了什么?

ʞɔı*_*ɔıu 61

使用concat:

SELECT concat('TRUNCATE TABLE `', TABLE_NAME, '`;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'inventory%'
Run Code Online (Sandbox Code Playgroud)

这当然只会生成您需要自己复制和运行的SQL.

  • 您可能还想添加`AND TABLE_SCHEMA ='mydatabase'以确保您只在特定数据库上运行.此外,添加"INTO OUTFILE"c:\\ script.sql'将阻止您复制和粘贴任何内容; 相反,只需运行脚本. (4认同)

小智 7

我知道它已经是一个较旧的帖子但是以下示例对于需要从linux命令行或shell脚本中截断多个表的人有用:

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>
Run Code Online (Sandbox Code Playgroud)

鉴于您需要用自己的值替换括号中的字符串,它对我有用.同时将'your_table_a,your_table_b,your_table_c'替换为以逗号分隔的表格列表.;)


小智 6

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;'
Run Code Online (Sandbox Code Playgroud)