我在 MySQL 5.7 版中有這個存盤程序。如果我想創建 n 個元素,在一個陳述句中插入 n 個元素兩次比呼叫存盤程序 n 次要快得多。
我如何創建一個存盤程序,它需要一個名稱的“串列”、一個團隊 id 并執行此操作?
CREATE PROCEDURE create_data_user(IN name VARCHAR(100), IN data_user_team_id INT)
BEGIN
START TRANSACTION;
INSERT INTO users (users.name, users.type)
VALUES (name, "team_data");
INSERT INTO team_members (team_id, user_id, mod_time)
VALUES (data_user_team_id, LAST_INSERT_ID(), UNIX_TIMESTAMP());
COMMIT;
END ;;
創建兩個元素的存盤程序如下所示:
CREATE PROCEDURE create_data_user(IN name VARCHAR(100), IN name2 VARCHAR(100), IN
data_user_team_id INT)
BEGIN
START TRANSACTION;
INSERT INTO users (users.name, users.type)
VALUES
(name, "team_data"),
(name2, "team_data");
INSERT INTO team_members (team_id, user_id, mod_time)
VALUES
(data_user_team_id, LAST_INSERT_ID(), UNIX_TIMESTAMP()),
(data_user_team_id, LAST_INSERT_ID() 1, UNIX_TIMESTAMP());
COMMIT;
END ;;
編輯:有不同的方法來解決這個問題。您可以只廢棄 SP 并復制粘貼批量插入代碼。Rick James 提出了一個復雜的解決方案,但我認為您可以做一些更簡單的事情,也許會犧牲一些性能(但比許多單獨的插入要好)。
在呼叫方你做這樣的事情:
CREATE TEMPORARY TABLE names (name);
INSERT INTO names
VALUES
(name1),
(name2),
...;
CALL create_data_users(1);
然后存盤程序是這樣的:
CREATE PROCEDURE create_data_users(IN data_user_team_id INT)
BEGIN
START TRANSACTION;
INSERT INTO users (users.name, users.type)
SELECT name, "team_data" FROM names;
SET @num=LAST_INSERT_ID();
INSERT INTO team_members (team_id, user_id, mod_time)
SELECT data_user_team_id, @num:=@num 1, UNIX_TIMESTAMP() FROM names;
COMMIT;
END ;;
uj5u.com熱心網友回復:
我發現最有效的概括,特別是對于長串列,是
- 建立臨時表
- 使用批處理
INSERT填充表 INSERT ... SELECT ...獲取真實表中的專案- 使用連接執行復雜更新以撤回所有 id。
(不涉及回圈。)
具體:http : //mysql.rjweb.org/doc.php/staging_table#normalization
(這集中在名稱已經在表中的非常可能的情況。但是,它應該適用于您的情況。)
uj5u.com熱心網友回復:
CREATE PROCEDURE create_data_users (IN users_list TEXT, IN data_user_team_id INT)
BEGIN
DECLARE name VARCHAR(255);
REPEAT
SET name = TRIM(SUBSTRING_INDEX(users_list, ',', 1));
SET users_list = CASE WHEN LOCATE(',', users_list)
THEN TRIM(SUBSTRING(users_list FROM 1 LOCATE(',', users_list)))
ELSE '' END;
INSERT INTO users (users.name, users.type)
VALUES (name, "team_data");
INSERT INTO team_members (team_id, user_id, mod_time)
VALUES (data_user_team_id, LAST_INSERT_ID(), UNIX_TIMESTAMP());
UNTIL users_list = '' END REPEAT;
END
https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=37e397c1066e1e8459df70fc6131e5d4
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/328753.html
