前言
MySQL官方将prepare、execute、deallocate统称为PREPARE STATEMENT,我习惯称其为【预处理语句】,其用法十分简单,下面话不多说,来一起看看详细的介绍吧。
示例代码
PREPARE stmt_name FROM preparable_stmt EXECUTE stmt_name [USING @var_name [, @var_name] ...] - {DEALLOCATE | DROP} PREPARE stmt_name
举个栗子:
mysql> PREPARE pr1 FROM 'SELECT ?+?'; Query OK, 0 rows affected (0.01 sec) Statement prepared mysql> SET @a=1, @b=10 ; Query OK, 0 rows affected (0.00 sec) mysql> EXECUTE pr1 USING @a, @b; +------+ | ?+? | +------+ | 11 | +------+ 1 row in set (0.00 sec) mysql> EXECUTE pr1 USING 1, 2; -- 只能使用用户变量传递。 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1, 2' at line 1 mysql> DEALLOCATE PREPARE pr1; Query OK, 0 rows affected (0.00 sec)
使用PAREPARE STATEMENT可以减少每次执行SQL的语法分析,比如用于执行带有WHERE条件的SELECT和DELETE,或者UPDATE,或者INSERT,只需要每次修改变量值即可。
同样可以防止SQL注入,参数值可以包含转义符和定界符。
适用在应用程序中,或者SQL脚本中均可。
更多用法:
同样PREPARE ... FROM可以直接接用户变量:
mysql> CREATE TABLE a (a int); Query OK, 0 rows affected (0.26 sec) mysql> INSERT INTO a SELECT 1; Query OK, 1 row affected (0.04 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> INSERT INTO a SELECT 2; Query OK, 1 row affected (0.04 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> INSERT INTO a SELECT 3; Query OK, 1 row affected (0.04 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> SET @select_test = CONCAT('SELECT * FROM ', @table_name); Query OK, 0 rows affected (0.00 sec) mysql> SET @table_name = 'a'; Query OK, 0 rows affected (0.00 sec) mysql> PREPARE pr2 FROM @select_test; Query OK, 0 rows affected (0.00 sec) Statement prepared mysql> EXECUTE pr2 ; +------+ | a | +------+ | 1 | | 2 | | 3 | +------+ 3 rows in set (0.00 sec) mysql> DROP PREPARE pr2; -- 此处DROP可以替代DEALLOCATE Query OK, 0 rows affected (0.00 sec)
每一次执行完EXECUTE时,养成好习惯,须执行DEALLOCATE PREPARE … 语句,这样可以释放执行中使用的所有数据库资源(如游标)。
不仅如此,如果一个session的预处理语句过多,可能会达到max_prepared_stmt_count的上限值。
预处理语句只能在创建者的会话中可以使用,其他会话是无法使用的。
而且在任意方式(正常或非正常)退出会话时,之前定义好的预处理语句将不复存在。
如果在存储过程中使用,如果不在过程中DEALLOCATE掉,在存储过程结束之后,该预处理语句仍然会有效。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。
主要内容:预处理语句及绑定参数,MySQLi 预处理语句,实例 (MySQLi 使用预处理语句),PDO 中的预处理语句,实例 (PDO 使用预处理语句)预处理语句对于防止 MySQL 注入是非常有用的。 预处理语句及绑定参数 预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高。 预处理语句的工作原理如下: 预处理:创建 SQL 语句模板并发送到数据库。预留的值使用参数 "?" 标记 。例如: 数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出。 执行:最后,将应用绑定的
本文向大家介绍MySQL中UPDATE与DELETE语句的使用教程,包括了MySQL中UPDATE与DELETE语句的使用教程的使用技巧和注意事项,需要的朋友参考一下 UPDATE 更新 UPDATE SET 语法用于修改更新数据表中的数据。 语法: 该语法将数据表中符合 WHERE 条件的记录中的 column1 的值更新为 new_value1,column2 的值更新为 new_value2
MySQL 5.1对服务器一方的预制语句提供支持。如果您使用合适的客户端编程界面,则这种支持可以发挥在MySQL 4.1中实施的高效客户端/服务器二进制协议的优势。候选界面包括MySQL C API客户端库(用于C程序)、MySQL Connector/J(用于Java程序)和MySQL Connector/NET。例如,C API可以提供一套能组成预制语句API的函数调用。请参见25.2.4节,
问题内容: 我只是想知道是否有一种方法可以在MySQL中使用某种形式的预处理语句,这样就不必逃避所有输入,也不必将所有文件从MySQL切换到MySQLi。我真的不相信转义功能,因此,如果在常规MySQL中有任何可行的替代方法,那就太好了。 问题答案: 使用PDO(PHP数据对象)连接到MySQL数据库。此方法将确保所有数据库输入将始终被视为文本字符串,并且您将不必进行任何手动转义。 结合正确使用h
问题内容: 在阅读golang SQL /数据库示例中“事务”中“准备”语句的示例时。其中一行说“危险”,但提供的代码示例没有其他选择。 我想对下面的查询有更清晰的解释,因为Wiki页面-http://go-database-sql.org/prepared.html上没有提供太多信息。 如果您在其中看到提及内容,那是很危险的,但还没有注释掉,请用户删除。 尽管我在上面的代码中没有看到问题,因为“
问题内容: 我有两个TSQL EXEC语句 如何使两个EXEC同步?; 现在,第二个EXEC不会等待第一个EXECUTE完成。我尝试发出WaitFor Delay,它等待,但是第二个EXEC语句永不恢复。 谢谢。 更新,这里是更多信息: 首先执行将创建一个全局临时表,并从一个复杂的SELECT查询中填充它。 第二个EXEC是CLR存储过程,它基于最近创建并填充的Global Temp表中的变量来生