簡體   English   中英

存儲過程MySQL中的變量

[英]Variables in stored procedure MySQL

我對這個簡單的存儲過程有疑問。 我想將LAST_INSERT_ID保存在變量中,然后將其分配給下一次插入。

    DELIMITER //
    CREATE PROCEDURE Adda(
       Name varCHAR(45),Surrname varCHAR(45),City varCHAR(45),PhoneNumber varCHAR(45),photo varCHAR(45))
    BEGIN
    START TRANSACTION;
       INSERT INTO Personal(Name,Surrname)
       VALUES(Name,Surrname);
       INSERT INTO Addres(Id_Personal_Address,Country, City) 
       VALUES(LAST_INSERT_ID(),Country,City);
--i think here i should assign LAST_INSER_ID to variable
        INSERT INTO Images(Id_Personal_Address,photo)
        VALUES(Photo); -- and here use it
    COMMIT;
    END//
    DELIMITER ;

我真的不知道該怎么做。

您需要聲明一個變量並使用set來賦值,例如:

DELIMITER //
    CREATE PROCEDURE Adda(
       Name varCHAR(45),Surrname varCHAR(45),City varCHAR(45),PhoneNumber varCHAR(45),photo varCHAR(45))
    BEGIN
    DECLARE last_insert_id INT;
    START TRANSACTION;
       INSERT INTO Personal(Name,Surrname)
       VALUES(Name,Surrname);
       SET last_insert_id = LAST_INSERT_ID(); --assignment
       INSERT INTO Addres(Id_Personal_Address,Country, City) 
       VALUES(last_insert_id,Country,City);
        INSERT INTO Images(Id_Personal_Address,photo)
        VALUES(last_insert_id, Photo); -- use
    COMMIT;
    END//
    DELIMITER ;

您知道可以將LAST_INSERT_ID()作為任何表達式的一部分來調用,包括下一個INSERT:

   INSERT INTO Addres(Id_Personal_Address,Country, City) 
   VALUES(LAST_INSERT_ID(),Country,City);

   INSERT INTO Images(Id_Personal_Address,photo)
   VALUES(LAST_INSERT_ID(), Photo); -- and here use it

但是LAST_INSERT_ID()始終返回由上一次INSERT生成的ID值。 如果您對Address的插入具有自動增量鍵,則它將成為新生成的“最后一個” id。

因此,如果您需要多次使用該值,則應為其聲明一個局部變量,因為在Images中插入INSERT會更改最后一個插入ID。

您可以在過程中聲明局部變量。 必須BEGIN開始之后

BEGIN
    DECLARE personalId INT DEFAULT NULL;

然后稍后使用:

    SET personalId = LAST_INSERT_ID();

    INSERT INTO Addres(Id_Personal_Address, Country, City) 
    VALUES(personalId, Country, City);

    INSERT INTO Images(Id_Personal_Address, photo)
    VALUES(personalId, Photo);

提示:選擇與列名不同的變量名以使代碼清晰。


那么在變量前使用@有什么用呢?

您可以使用類似@addressId的變量,而無需先進行DECLARE 但是該變量將成為用戶定義的會話變量,並在過程退出后保留其值。 除非您不小心覆蓋了會話范圍中的變量,否則不會造成任何傷害。 或者,如果您編寫的存儲過程調用了另一個存儲過程,並且它們都試圖使用相同的變量名。

使用DECLARE創建一個真正在過程范圍內本地的變量。

更加令人困惑的是,您可以聲明給定名稱的變量,然后使用與@相同的名稱,但這是不同的變量。

例如,這是在MySQL 8.0.0上測試的一個演示:

mysql> delimiter ;;
mysql> create procedure foo()
    -> begin
    ->  declare last_insert_id int default 0;
    ->  set @last_insert_id = 1234;
    ->  select last_insert_id;
    -> end;;
mysql> delimiter ;

mysql> call foo();
+----------------+
| last_insert_id |
+----------------+
|              0 |
+----------------+

mysql> select @last_insert_id;
+-----------------+
| @last_insert_id |
+-----------------+
|            1234 |
+-----------------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM