2017-08-19 24 views
0

我創建了一個存儲過程,因爲我想要一個場景,我想從數據庫中獲取下一個數字。mysql存儲過程不一致地遞增所有記錄

DELIMITER $$ 
CREATE PROCEDURE `INCREMENT_IDENTIFIERS`(IN key_name varchar(30)) 
BEGIN 
    SET @keyName := key_name; 
    UPDATE APS_IDENTIFIERS SET COUNTER = COUNTER + 1 WHERE KEY_NAME = @keyName; 
    SELECT * FROM APS_IDENTIFIERS WHERE KEY_NAME = @keyName; 
END$$ 
DELIMITER ; 

初始色譜柱調用存儲過程

call INCREMENT_IDENTIFIERS('urn'); 

Final Column Values after calling stored procedure

後的值

Initial value before calling stored procedure

最終列值

現在我的問題是,即使我傳遞完全匹配輸入條件,爲什麼這個存儲過程增加了兩行,並且它將兩行作爲輸出返回值增加。

+0

沒有必要使用[9.4 User-Defined Variables](https://dev.mysql.com/doc/refman/5.7/en/user-variables.html),可以使用輸入參數或[ 13.6.4.1局部變量DECLARE語法](https://dev.mysql.com/doc/refman/5.7/en/declare-local-variable.html)。 – wchiquito

+0

@wchiquito可以請您詳細說明,實際上我需要從我的Java代碼中調用此過程。因此,我需要爲我想增加的特定鍵定義一個用戶定義的變量。 –

回答

1

這是沒有必要使用9.4 User-Defined Variables,可以使用輸入參數或13.6.4.1 Local Variable DECLARE Syntax

mysql> DELIMITER // 

mysql> CREATE PROCEDURE `INCREMENT_IDENTIFIERS`(
    -> `in_key_name` VARCHAR(30) 
    ->) 
    -> BEGIN 
    -> UPDATE `APS_IDENTIFIERS` 
    -> SET `COUNTER` = `COUNTER` + 1 
    -> WHERE `KEY_NAME` = `in_key_name`; 
    -> SELECT `KEY_NAME`, `COUNTER` 
    -> FROM `APS_IDENTIFIERS` 
    -> WHERE `KEY_NAME` = `in_key_name`; 
    -> END// 
Query OK, 0 rows affected (0.00 sec) 

mysql> DELIMITER ; 

mysql> CALL `INCREMENT_IDENTIFIERS`('urn'); 
+----------+---------+ 
| KEY_NAME | COUNTER | 
+----------+---------+ 
| urn  |  3 | 
+----------+---------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

db-fiddle

UPDATE

使用列名作爲參數名稱避免:

mysql> DELIMITER // 

mysql> CREATE PROCEDURE `INCREMENT_IDENTIFIERS`(
    -> `key_name` VARCHAR(30) -- CHANGE NAME 
    ->) 
    -> BEGIN 
    -> SET @`keyName` := `key_name`; 
    -> UPDATE `APS_IDENTIFIERS` 
    -> SET `COUNTER` = `COUNTER` + 1 
    -> WHERE `KEY_NAME` = @`keyName`; 
    -> SELECT `KEY_NAME`, `COUNTER` 
    -> FROM `APS_IDENTIFIERS` 
    -> WHERE `KEY_NAME` = @`keyName`; 
    -> END// 
Query OK, 0 rows affected (0.00 sec) 

mysql> DELIMITER ; 

mysql> CALL `INCREMENT_IDENTIFIERS`('urn'); 
+------------+---------+ 
| `KEY_NAME` | COUNTER | 
+------------+---------+ 
| urn  |  69 | 
| urn  |  3 | 
+------------+---------+ 
2 rows in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

新參數名:

mysql> DELIMITER // 

mysql> CREATE PROCEDURE `INCREMENT_IDENTIFIERS`(
    -> `_key_name` VARCHAR(30) -- NEW NAME 
    ->) 
    -> BEGIN 
    -> SET @`keyName` := `_key_name`; 
    -> UPDATE `APS_IDENTIFIERS` 
    -> SET `COUNTER` = `COUNTER` + 1 
    -> WHERE `KEY_NAME` = @`keyName`; 
    -> SELECT `KEY_NAME`, `COUNTER` 
    -> FROM `APS_IDENTIFIERS` 
    -> WHERE `KEY_NAME` = @`keyName`; 
    -> END// 
Query OK, 0 rows affected (0.00 sec) 

mysql> DELIMITER ; 

mysql> CALL `INCREMENT_IDENTIFIERS`('urn'); 
+----------+---------+ 
| KEY_NAME | COUNTER | 
+----------+---------+ 
| urn  |  3 | 
+----------+---------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

db-fiddle

檢查文檔13.6.4.2 Local Variable Scope and Resolution

UPDATE 2

另一種選擇(較少推薦)是使用合格的列名(APS_IDENTIFIERS.KEY_NAME):

mysql> DELIMITER // 

mysql> CREATE PROCEDURE `INCREMENT_IDENTIFIERS`(
    -> `key_name` VARCHAR(30) 
    ->) 
    -> BEGIN 
    -> SET @`keyName` := `key_name`; 
    -> UPDATE `APS_IDENTIFIERS` 
    -> SET `COUNTER` = `COUNTER` + 1 
    -> WHERE `APS_IDENTIFIERS`.`KEY_NAME` = @`keyName`; 
    -> SELECT `KEY_NAME`, `COUNTER` 
    -> FROM `APS_IDENTIFIERS` 
    -> WHERE `APS_IDENTIFIERS`.`KEY_NAME` = @`keyName`; 
    -> END// 
Query OK, 0 rows affected (0.00 sec) 

mysql> DELIMITER ; 

mysql> CALL `INCREMENT_IDENTIFIERS`('urn'); 
+------------+---------+ 
| `KEY_NAME` | COUNTER | 
+------------+---------+ 
| urn  |  3 | 
+------------+---------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

參見db-fiddle

檢查文檔9.2.1 Identifier Qualifiers

+0

感謝您的及時響應。我認爲主要的錯誤是使用與列名相同的變量名。 –

+1

@AnkurJain:查看新的更新。 – wchiquito