Mysql中使用select into語句給變數賦值沒有匹配記錄時的結果
阿新 • • 發佈:2019-01-26
前言
對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)
測試過程
- 當查詢結果中不存在符合條件的記錄時會怎樣,修改儲存過程定義,然後檢視執行結果:
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
的賦值效果。
- 當匹配到查詢結果但是查詢出來的數值為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錯誤除外)。
- 當連續查詢賦值中間出現不匹配會怎樣,修改儲存過程定義,然後檢視執行結果:
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)
想必明白了前兩種情況,這第三種也應該明白了,兩條語句順序執行,找到匹配的就賦值,找不到就放棄操作,結果就保留了上一次成功賦值的結果。
總結
- 關於
select into
語句賦值的規則就一句話,找到了符合條件的記錄就賦值,找不到就算了。 - 在找到記錄的前提下,如果型別不匹配會導致賦值失敗並報錯,比如查詢到字串賦值給整型變數。