Mysql 准备好的发言
我有一个准备好的语句,我想直接执行到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`
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,这是有意义的,因为其他示例使用的是静态集。