1. 程式人生 > >Mysql中使用select into語句給變數賦值沒有匹配記錄時的結果

Mysql中使用select into語句給變數賦值沒有匹配記錄時的結果

前言

select into語句感興趣是因為看了專案中的一個儲存過程引起的,在程式執行之前看了儲存過程的邏輯,本以為沒有資料時會報錯,結果程式卻正常執行,這說明我對select into語句理解的問題,同時也暴露了一個知識盲點,所以寫了個小例子測試一下,並把測試的過程記錄方便日後查詢。

建立測試表格

為了更清楚的表明問題,我們建立的表格儘可能的簡單,同時為了測試空值的情況,資料列我們不設定預設值,表格命名為’intotest’,建立語句如下:

CREATE TABLE `intotest` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `number`
int(4), PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=binary ROW_FORMAT=DYNAMIC;

插入測試資料

表格建立完成可以使用視覺化工具或者insert語句插入測試資料,插入測試資料後查詢結果如下:

mysql> select * from intotest;
+----+--------+
| id | number |
+----+--------+
|  1 |      1 |
|  2 |      2 |
|  3 |   NULL |
+----+--------+
3 rows in set
(0.00 sec)

建立一個儲存過程

我們建立一個用於測試的儲存過程,主要的邏輯就是看看當select into語句找不到匹配記錄時,被賦值的變數會怎麼樣,建立儲存過程的程式碼如下:

CREATE PROCEDURE `select_into_value2`()
BEGIN
    DECLARE _value INT DEFAULT 0;

    SELECT number FROM intotest WHERE id=1 INTO _value;
    SELECT _value;
END

這個儲存過程執行正常,配合剛才我們插入表格的記錄可以知道,執行後的結果為1:

mysql>
call select_into_value(); +--------+ | _value | +--------+ | 1 | +--------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec)

測試過程

  1. 當查詢結果中不存在符合條件的記錄時會怎樣,修改儲存過程定義,然後檢視執行結果:
CREATE PROCEDURE `select_into_value2`()
BEGIN
    DECLARE _value INT DEFAULT 0;

    SELECT number FROM intotest WHERE id=5 INTO _value;
    SELECT _value;
END
mysql> call select_into_value();
+--------+
| _value |
+--------+
|      0 |
+--------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

結果為0,也就是說當查不到匹配結果時,不會執行select into的賦值效果。

  1. 當匹配到查詢結果但是查詢出來的數值為null會怎樣,修改儲存過程定義,然後檢視執行結果:
CREATE PROCEDURE `select_into_value2`()
BEGIN
    DECLARE _value INT DEFAULT 0;

    SELECT number FROM intotest WHERE id=3 INTO _value;
    SELECT _value;
END
mysql> call select_into_value();
+--------+
| _value |
+--------+
|   NULL |
+--------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

結果為NULL,也就是說當查到匹配結果時,不管結果時什麼都會賦值到指定的變數中(型別不匹配的sql錯誤除外)。

  1. 當連續查詢賦值中間出現不匹配會怎樣,修改儲存過程定義,然後檢視執行結果:
CREATE PROCEDURE `select_into_value2`()
BEGIN
    DECLARE _value INT DEFAULT 0;

    SELECT number FROM intotest WHERE id=2 INTO _value;
    SELECT number FROM intotest WHERE id=5 INTO _value;
    SELECT _value;
END
mysql> call select_into_value();
+--------+
| _value |
+--------+
|      2 |
+--------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

想必明白了前兩種情況,這第三種也應該明白了,兩條語句順序執行,找到匹配的就賦值,找不到就放棄操作,結果就保留了上一次成功賦值的結果。

總結

  1. 關於select into語句賦值的規則就一句話,找到了符合條件的記錄就賦值,找不到就算了。
  2. 在找到記錄的前提下,如果型別不匹配會導致賦值失敗並報錯,比如查詢到字串賦值給整型變數。