Mysql 准备好的发言

Mysql 准备好的发言,mysql,prepared-statement,Mysql,Prepared Statement,我有一个准备好的语句,我想直接执行到MySQL服务器 USE `testdb`; SET @t = ( SELECT GROUP_CONCAT(mytab.TABLE_NAME SEPARATOR ', ') FROM (SELECT * FROM information_schema.TABLES as `m` WHERE table_schema = 'testdb' AND table_name LIKE 'mi_%' LIMIT 0,1) as `mytab`

我有一个准备好的语句,我想直接执行到MySQL服务器

USE `testdb`;
SET @t = (
    SELECT GROUP_CONCAT(mytab.TABLE_NAME SEPARATOR ', ') 
    FROM (SELECT * FROM information_schema.TABLES as `m` WHERE table_schema = 'testdb' AND table_name LIKE 'mi_%' LIMIT 0,1) as `mytab`
    );
PREPARE `stmt1` FROM 'DROP TABLE t';
EXECUTE `stmt1` USING @t;
DEALLOCATE PREPARE `stmt1`;
但是,当我执行时,它在执行行上返回一个错误

错误代码:1210。要执行的参数不正确

如果你能帮我做错事,我将不胜感激


我有mysql 5.1.68版

您的问题可以通过在执行之前准备完全静态的DDL来解决。样本:

表:

mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | a | | b | +----------------+ 2 rows in set (0.00 sec) 还有您的小修改SQL:

mysql> SET @t = (SELECT GROUP_CONCAT(mytab.TABLE_NAME SEPARATOR ', ') FROM (SELECT * FROM information_schema.TABLES as `m` WHERE table_schema = 'test' AND table_name LIKE 'a%' LIMIT 0,1) as `mytab`); Query OK, 0 rows affected (0.06 sec) mysql> select @t; +------+ | @t | +------+ | a | +------+ 1 row in set (0.00 sec) 现在,DDL:

mysql> set @drop = CONCAT('DROP TABLE ', @t); Query OK, 0 rows affected (0.00 sec) mysql> select @drop; +--------------+ | @drop | +--------------+ | DROP TABLE a | +--------------+ 1 row in set (0.00 sec) 最后,准备好的声明:

mysql> PREPARE `stmt1` FROM @drop; Query OK, 0 rows affected (0.00 sec) Statement prepared mysql> EXECUTE `stmt1`; Query OK, 0 rows affected (0.00 sec) 您将获得:

mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | b | +----------------+ 1 row in set (0.00 sec)
您只能使用我添加的@drop来增加可读性的一个变量

为什么要准备一个drop表,但要执行select?在一个prepared语句中,您不能将变量数据用于任何MySQL标识符,比如表名。在本例中,由于您使用的是从MySQL自己的系统表查询的数据,所以预先准备好的语句根本没有任何好处。啊,谢谢Mike,这是有意义的,因为其他示例使用的是静态集。