gpt4 book ai didi

MySQL 存储过程从列表中插入多行

转载 作者:行者123 更新时间:2023-11-29 01:53:29 25 4
gpt4 key购买 nike

如何编写 MySQL 存储过程来从可变大小的列表中插入值?更具体地说,我需要将数据插入到一个父表中,从插入中获取 ID,然后以一对多关系将可变数量的子记录连同新 ID 插入到另一个表中。我的架构看起来像这样:

表A:

table_a_id -- Auto Increment
counter
some_data...

表B:

table_b_id -- Auto Increment
table_a_id -- Foreign Key Constraint
some_data_from_list...

到目前为止,我的存储过程如下所示:

DELIMITER ;;
CREATE PROCEDURE insert_group_alert(
IN _some_data_a VARCHAR(255),
IN _data_list_b TEXT,
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
END;
START TRANSACTION;

INSERT INTO TableA (
some_data,
counter
)
VALUES (
_some_data_a,
1
)
ON DUPLICATE KEY UPDATE
counter = counter + 1;

SELECT last_insert_id()
INTO @newId;

LIST INSERT ???:
INSERT INTO TableB (
table_a_id, some_data
) VALUES (
@newId,
list_item,
);
END LIST INSERT ???

COMMIT;
END ;;
DELIMITER ;

我的想法是通过逗号分隔的字符串传入一个项目列表以插入到表 B 中。值是字符串。我不确定在 LIST INSERT 部分要做什么。我需要某种循环吗?到目前为止,这个存储过程是执行此操作的正确方法吗?我不想批量处理,因为列表中可能有成百上千个项目。有更好的解决方案吗?我直接使用 JDBC。

最佳答案

是的,您需要一个循环,您可以在其中使用 substring_index() 来获取列表中的值。解决方案基于this SO topic的答案。 :

DELIMITER ;;
CREATE PROCEDURE insert_group_alert(
IN _some_data_a VARCHAR(255),
IN _data_list_b TEXT,
)
BEGIN
DECLARE strLen INT DEFAULT 0;
DECLARE SubStrLen INT DEFAULT 0;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
END;
START TRANSACTION;

INSERT INTO TableA (
some_data,
counter
)
VALUES (
_some_data_a,
1
) -- you do not really need this, since you do not provide an id
ON DUPLICATE KEY UPDATE
counter = counter + 1;

SELECT last_insert_id()
INTO @newId;

do_this:
LOOP
SET strLen = CHAR_LENGTH(_data_list_b);

INSERT INTO TableB (table_a_id, some_data) VALUES(@newId,SUBSTRING_INDEX(_data_list_b, ',', 1));

SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(_data_list_b, ',', 1))+2;
SET _data_list_b = MID(_data_list_b, SubStrLen, strLen); --cut the 1st list item out

IF _data_list_b = '' THEN
LEAVE do_this;
END IF;
END LOOP do_this;

COMMIT;
END ;;
DELIMITER ;

关于MySQL 存储过程从列表中插入多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35169922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com