无法在MySQL中创建准备好的语句

时间:2011-05-17 12:15:26

标签: mysql prepared-statement

我正在尝试在MySQL中创建一个带有单个参数的预准备语句。当我在命令行上尝试此操作时,我收到语法错误。但是,当我准备好的声明中没有变量时,我能够很好地创建它们。下面是我在MySQL命令提示符下看到的复制和粘贴:

mysql> PREPARE state_name FROM "select * from ? limit 1";

错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在'附近使用正确的语法?在第1行限制1'

mysql> PREPARE state_name FROM "select * from documents limit 1";
Query OK, 0 rows affected (0.00 sec)
Statement prepared

我正在使用的MySQL版本是5.0.77-log。

我没有看到语法错误吗?我是否需要设置任何配置参数才能使预备语句生效?

2 个答案:

答案 0 :(得分:5)

您不能将表名作为预处理语句参数传递,我担心,您也不能将列传递给分组或排序。您可以参数化的唯一内容是where子句或更新中的字段:

PREPARE state_name FROM "select * from documents where id = ?";

PREPARE state_name FROM "update documents set field = ? where id = ?";

答案 1 :(得分:1)

如果你想创建一个单独的prepare语句并将它用于多个表,你实际上为每个表创建一个变量,然后使用这个变量创建语句,因为MySQL manual解释它:

mysql> USE test;
mysql> CREATE TABLE t1 (a INT NOT NULL);
mysql> INSERT INTO t1 VALUES (4), (8), (11), (32), (80);

mysql> SET @table = 't1';
mysql> SET @s = CONCAT('SELECT * FROM ', @table);

mysql> PREPARE stmt3 FROM @s;
mysql> EXECUTE stmt3;
+----+
| a  |
+----+
|  4 |
|  8 |
| 11 |
| 32 |
| 80 |
+----+

mysql> DEALLOCATE PREPARE stmt3;