mysql使用带有动态表名的SHOW CREATE TABLE

时间:2016-04-07 19:53:11

标签: mysql sql

我希望能够从SHOW CREATE TABLE中查看用于调试目的的任何表的sql文本。准备好逃跑可以做到吗?

// doesn't work because table name is escaped as string
 SHOW CREATE TABLE ?

//doesn't work, syntax is not allowed    
SHOW CREATE TABLE (SELECT table_name FROM `INFORMATION_SCHEMA.tables`   WHERE  `TABLE_NAME`=?)

1 个答案:

答案 0 :(得分:1)

您可以使用预备声明:

-- here goes your table name, could be parametrized to call from app
SET @tab_name = '`tab`';   

SET @query = REPLACE('SHOW CREATE TABLE @tab_name', '@tab_name', @tab_name);

-- SELECT @query;

PREPARE stmt1 FROM @query;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

SqlFiddleDemo

输出:

╔════════╦═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ Table  ║                                                    Create Table                                                     ║
╠════════╬═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ tab    ║ CREATE TABLE `tab` ( `col1` int(11) DEFAULT NULL, `col2` datetime DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ║
╚════════╩═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝

如果你需要每个表,你可以用循环或光标包装它。

警告:

您应该在应用程序层引用@tab_name以避免SQL注入。