国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

MySQL 之變量

rainyang / 3503人閱讀

摘要:為用戶(hù)變量賦值時(shí),會(huì)先確定表達(dá)式的值。作為變量,都是有作用域的,用戶(hù)變量的作用是整個(gè)會(huì)話(huà),即整個(gè)會(huì)話(huà)間都是有效的。注意要想更改全局變量,必須具有權(quán)限。

MySQL 之變量

MySQL 的變量分為四種: 局部變量用戶(hù)變量會(huì)話(huà)變量全局變量 ,其中局部變量只存在于函數(shù)和存儲(chǔ)過(guò)程,這里不多了解。其中 會(huì)話(huà)變量全局變量 在 MySQL 中統(tǒng)稱(chēng)為 系統(tǒng)變量

用戶(hù)變量 基本

顧名思義,就是用戶(hù)定義的變量。如何定義變量呢?有兩種方法:

SET 方式

# 兩種方式都可以
SET @variable = expr
SET @variable := expr

SELECT 方式

# 必須 :=
SELECT @variable := expr

用戶(hù)變量定義備注:

未定義變量的初始值為 null(可不定義變量直接使用,不會(huì)報(bào)錯(cuò))

變量名對(duì)大小寫(xiě)不敏感

變量不能在要求字面值的地方使用,比如 select 中的 limit 語(yǔ)句等。

調(diào)用用戶(hù)變量的表達(dá)式的計(jì)算順序?qū)嶋H上是未定義的,如 SELECT @a = 0, @a := @a + 1;,兩列都可能是 0 。

為用戶(hù)變量賦值時(shí),會(huì)先確定表達(dá)式的值。如何理解,請(qǐng)看如下代碼:

SET @m = 0;
SET @m = 3, @n = @m;
SELECT @n; # 0

雖然用戶(hù)變量的類(lèi)型可以動(dòng)態(tài)修改,但不建議這么操作,因?yàn)樵诮唤哟a的時(shí)候你可能會(huì)有生命危險(xiǎn):p。

作為變量,都是有作用域的,用戶(hù)變量的作用是整個(gè)會(huì)話(huà),即整個(gè)會(huì)話(huà)間都是有效的。這看起來(lái)不錯(cuò),但要注意,當(dāng)使用了連接池,自定義的用戶(hù)變量又沒(méi)有正確初始化,容易出現(xiàn)意想不到的問(wèn)題。因?yàn)樗鼘?shí)際上并沒(méi)有被銷(xiāo)毀,依舊記錄者上一次的結(jié)果。

示例

我們來(lái)一個(gè)簡(jiǎn)單的示例,實(shí)現(xiàn)一個(gè)序號(hào)的功能,表和數(shù)據(jù)如下:

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);

根據(jù)之前學(xué)習(xí)的內(nèi)容,我們可以很快的寫(xiě)出如下 SQL:

SELECT salary, (@rowno := @rowno + 1) AS "rowno"
FROM employee, (SELECT @rowno := 0) r;

沒(méi)有問(wèn)題,一切都和預(yù)期一樣,然后我們加一個(gè) WHERE 條件試試:

SELECT salary, (@rowno := @rowno + 1) AS "rowno"
FROM employee, (SELECT @rowno := 0) r
WHERE @rowno = 0;

理論上來(lái)說(shuō),這是不應(yīng)該返回?cái)?shù)據(jù)的,但是它還就是返回了一條數(shù)據(jù),就是 id 為 1 的那條。
為什么呢? WHERE 條件使用的 @rowno 一直都是同一個(gè)值 0 ,它不會(huì)因?yàn)?SELECT 上修改了就實(shí)時(shí)響應(yīng) 。要實(shí)現(xiàn)
WHERE 的功能需要改寫(xiě)成如下:

SELECT salary, rowno
FROM (
    SELECT salary, (@rowno := @rowno + 1) AS "rowno"
    FROM employee, (SELECT @rowno := 0) r
) m
WHERE rowno = 2;

實(shí)際上在 SELECTWHEREGROUP BYORDER BY 中用戶(hù)變量都不會(huì)按預(yù)期操作,它使用的是舊值,不會(huì)實(shí)時(shí)修改。

系統(tǒng)變量 會(huì)話(huà)變量

會(huì)話(huà)變量為服務(wù)器為每個(gè)客戶(hù)端連接維護(hù)的變量。在客戶(hù)端連接時(shí),使用相應(yīng)全局變量的當(dāng)前值對(duì)客戶(hù)端的會(huì)話(huà)變量進(jìn)行初始化。

顧名思義,會(huì)話(huà)變量的作用域就是一個(gè)會(huì)話(huà) Session 咯。如何為會(huì)話(huà)變量設(shè)置值呢?如下:

set session var_name = value;
set @@session.var_name = value;
set var_name = value;

注意,只能為現(xiàn)有的會(huì)話(huà)變量設(shè)置值,不能創(chuàng)建新的會(huì)話(huà)變量。那如何獲取會(huì)話(huà)變量呢?如下:

show session variables;
# 以上代碼會(huì)把所有會(huì)話(huà)變量羅列出來(lái),可通過(guò) like 進(jìn)行過(guò)濾
show session variables LIKE "%var%";
全局變量

全局變量會(huì)影響服務(wù)器整體操作。但是一旦重啟,這些設(shè)置會(huì)被重置。注意要想更改全局變量,必須具有SUPER權(quán)限。

它的設(shè)置和會(huì)話(huà)變量的設(shè)置是類(lèi)似的:

set global var_name = value;
set @@global.var_name = value;

全局變量也不能新增變量,只能修改已有的。而獲取全局變量的操作也是和會(huì)話(huà)變量類(lèi)似:

show session variables;
show global variables like "%var%";

文章若有問(wèn)題,歡迎在評(píng)論區(qū)中指正。


參考:

深入MySQL用戶(hù)自定義變量:使用詳解及其使用場(chǎng)景案例

mysql用戶(hù)變量和set語(yǔ)句

9.4 User-Defined Variables

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/17874.html

相關(guān)文章

  • MySQL內(nèi)核技術(shù)“pthead局部變量

    摘要:使用了稱(chēng)之為的一系列文件和結(jié)構(gòu)來(lái)進(jìn)行監(jiān)控。的使用就像一個(gè)全局變量,哪個(gè)線(xiàn)程都可以用,但是實(shí)際上對(duì)應(yīng)了線(xiàn)程內(nèi)部的變量值,可以參見(jiàn)該例。規(guī)定,線(xiàn)程存儲(chǔ)變量必須要先初始化。 MySQL使用了稱(chēng)之為psi/pfs的一系列文件和結(jié)構(gòu)來(lái)進(jìn)行performance監(jiān)控。Psi全稱(chēng)為performance schema interface,pfs全稱(chēng)為performance storage。 該機(jī)制使...

    KnewOne 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<