MySQL中預(yù)處理語句prepare、execute與deallocate的使用教程
前言
MySQL官方將prepare、execute、deallocate統(tǒng)稱為PREPARE STATEMENT,我習(xí)慣稱其為【預(yù)處理語句】,其用法十分簡單,下面話不多說,來一起看看詳細(xì)的介紹吧。
示例代碼
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可以減少每次執(zhí)行SQL的語法分析,比如用于執(zhí)行帶有WHERE條件的SELECT和DELETE,或者UPDATE,或者INSERT,只需要每次修改變量值即可。
同樣可以防止SQL注入,參數(shù)值可以包含轉(zhuǎn)義符和定界符。
適用在應(yīng)用程序中,或者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)
每一次執(zhí)行完EXECUTE時,養(yǎng)成好習(xí)慣,須執(zhí)行DEALLOCATE PREPARE … 語句,這樣可以釋放執(zhí)行中使用的所有數(shù)據(jù)庫資源(如游標(biāo))。
不僅如此,如果一個session的預(yù)處理語句過多,可能會達(dá)到max_prepared_stmt_count的上限值。
預(yù)處理語句只能在創(chuàng)建者的會話中可以使用,其他會話是無法使用的。
而且在任意方式(正?;蚍钦#┩顺鰰挄r,之前定義好的預(yù)處理語句將不復(fù)存在。
如果在存儲過程中使用,如果不在過程中DEALLOCATE掉,在存儲過程結(jié)束之后,該預(yù)處理語句仍然會有效。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
MySql數(shù)據(jù)庫單表查詢與多表連接查詢效率對比
在遇到數(shù)據(jù)之間的聯(lián)系很復(fù)雜,建表就很糾結(jié),到底該怎么去處理這些復(fù)雜的數(shù)據(jù)呢,是單表查詢,然后在業(yè)務(wù)層去處理數(shù)據(jù)間的關(guān)系,還是直接通過多表連接查詢來處理數(shù)據(jù)關(guān)系呢2021-09-09
MySQL表不存在Table doesn't exist錯誤的常見原因及解決方案
在MySQL數(shù)據(jù)庫操作中,Table doesn't exis是一個常見的錯誤,通常發(fā)生在嘗試訪問不存在的表時,這個錯誤可能由多種原因引起,本文將系統(tǒng)性總結(jié)Table doesn't exist錯誤的常見原因及解決方案,并提供豐富的代碼和表格示例分析,需要的朋友可以參考下2025-06-06
MySQL 8.2 Command Line Client打開時一閃而過閃退問題
MySQL8.2安裝成功后,發(fā)現(xiàn)打開MySQL 8.0 Command Line Client時出現(xiàn)一閃而過,打不開的情況,所以下面這篇文章主要給大家介紹了關(guān)于MySQL 8.2 Command Line Client打開時一閃而過閃退問題的解決,需要的朋友可以參考下2024-01-01
解決Can''t locate ExtUtils/MakeMaker.pm in @INC報錯
今天小編就為大家分享一篇關(guān)于解決Can't locate ExtUtils/MakeMaker.pm in @INC報錯,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01
小型Drupal數(shù)據(jù)庫備份以及大型站點(diǎn)MySQL備份策略分享
為了防止web服務(wù)器出現(xiàn)故障而引起的數(shù)據(jù)丟失,數(shù)據(jù)庫備份顯得非常重要,以免出現(xiàn)重大損失。本文分析研究一下小型的Drupal站的備份策略以及大型站點(diǎn)的mysql備份策略2014-11-11

