摘要:為用戶變量賦值時,會先確定表達式的值。作為變量,都是有作用域的,用戶變量的作用是整個會話,即整個會話間都是有效的。注意要想更改全局變量,必須具有權限。
MySQL 之變量
MySQL 的變量分為四種: 局部變量 、 用戶變量 、 會話變量 和 全局變量 ,其中局部變量只存在于函數和存儲過程,這里不多了解。其中 會話變量 和 全局變量 在 MySQL 中統稱為 系統變量 。
用戶變量 基本顧名思義,就是用戶定義的變量。如何定義變量呢?有兩種方法:
SET 方式
# 兩種方式都可以 SET @variable = expr SET @variable := expr
SELECT 方式
# 必須 := SELECT @variable := expr
用戶變量定義備注:
未定義變量的初始值為 null(可不定義變量直接使用,不會報錯)
變量名對大小寫不敏感
變量不能在要求字面值的地方使用,比如 select 中的 limit 語句等。
調用用戶變量的表達式的計算順序實際上是未定義的,如 SELECT @a = 0, @a := @a + 1;,兩列都可能是 0 。
為用戶變量賦值時,會先確定表達式的值。如何理解,請看如下代碼:
SET @m = 0; SET @m = 3, @n = @m; SELECT @n; # 0
雖然用戶變量的類型可以動態修改,但不建議這么操作,因為在交接代碼的時候你可能會有生命危險:p。
作為變量,都是有作用域的,用戶變量的作用是整個會話,即整個會話間都是有效的。這看起來不錯,但要注意,當使用了連接池,自定義的用戶變量又沒有正確初始化,容易出現意想不到的問題。因為它實際上并沒有被銷毀,依舊記錄者上一次的結果。
示例我們來一個簡單的示例,實現一個序號的功能,表和數據如下:
CREATE TABLE employee ( id int primary key, salary int not null ); INSERT INTO employee VALUES(1, 100); INSERT INTO employee VALUES(2, 200); INSERT INTO employee VALUES(3, 300);
根據之前學習的內容,我們可以很快的寫出如下 SQL:
SELECT salary, (@rowno := @rowno + 1) AS "rowno" FROM employee, (SELECT @rowno := 0) r;
沒有問題,一切都和預期一樣,然后我們加一個 WHERE 條件試試:
SELECT salary, (@rowno := @rowno + 1) AS "rowno" FROM employee, (SELECT @rowno := 0) r WHERE @rowno = 0;
理論上來說,這是不應該返回數據的,但是它還就是返回了一條數據,就是 id 為 1 的那條。
為什么呢? WHERE 條件使用的 @rowno 一直都是同一個值 0 ,它不會因為 SELECT 上修改了就實時響應 。要實現
WHERE 的功能需要改寫成如下:
SELECT salary, rowno FROM ( SELECT salary, (@rowno := @rowno + 1) AS "rowno" FROM employee, (SELECT @rowno := 0) r ) m WHERE rowno = 2;
實際上在 SELECT 的 WHERE 、 GROUP BY 和 ORDER BY 中用戶變量都不會按預期操作,它使用的是舊值,不會實時修改。
系統變量 會話變量會話變量為服務器為每個客戶端連接維護的變量。在客戶端連接時,使用相應全局變量的當前值對客戶端的會話變量進行初始化。
顧名思義,會話變量的作用域就是一個會話 Session 咯。如何為會話變量設置值呢?如下:
set session var_name = value; set @@session.var_name = value; set var_name = value;
注意,只能為現有的會話變量設置值,不能創建新的會話變量。那如何獲取會話變量呢?如下:
show session variables; # 以上代碼會把所有會話變量羅列出來,可通過 like 進行過濾 show session variables LIKE "%var%";全局變量
全局變量會影響服務器整體操作。但是一旦重啟,這些設置會被重置。注意要想更改全局變量,必須具有SUPER權限。
它的設置和會話變量的設置是類似的:
set global var_name = value; set @@global.var_name = value;
全局變量也不能新增變量,只能修改已有的。而獲取全局變量的操作也是和會話變量類似:
show session variables; show global variables like "%var%";
文章若有問題,歡迎在評論區中指正。
參考:
深入MySQL用戶自定義變量:使用詳解及其使用場景案例
mysql用戶變量和set語句
9.4 User-Defined Variables
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/17874.html
摘要:使用了稱之為的一系列文件和結構來進行監控。的使用就像一個全局變量,哪個線程都可以用,但是實際上對應了線程內部的變量值,可以參見該例。規定,線程存儲變量必須要先初始化。 MySQL使用了稱之為psi/pfs的一系列文件和結構來進行performance監控。Psi全稱為performance schema interface,pfs全稱為performance storage。 該機制使...
閱讀 2934·2021-11-04 16:06
閱讀 772·2021-09-30 09:56
閱讀 1839·2021-09-22 10:02
閱讀 2619·2019-08-29 13:43
閱讀 2215·2019-08-29 13:42
閱讀 2297·2019-08-29 12:21
閱讀 1053·2019-08-29 11:29
閱讀 1383·2019-08-26 13:51