[英]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.