从mysql 5.7中的变量将多行插入表中
Posted
技术标签:
【中文标题】从mysql 5.7中的变量将多行插入表中【英文标题】:insert multiple rows into table from a variable in mysql 5.7 【发布时间】:2020-05-12 23:27:24 【问题描述】:这是我的问题。我有以下存储过程,其中我传递了变量“session_ids”,它实际上是一组值(“1”、“2”、“3”、...、“n”)。 我如何将这些值中的每一个传递到临时表的相应行数中?例如,第 1 行的值为“1”,第 2 行的值为“2”,...,第 n 行的值为“n”。
实际上,我想动态执行此操作,因为我不知道变量“session_ids”中值的数量。我有这个想法,但它不起作用。
PROCEDURE `migrate_session_ids`(IN session_ids LONGTEXT)
CREATE TEMPORARY TABLE tempTable (id INT NOT NULL AUTO_INCREMENT, session_id BIGINT, PRIMARY KEY (`id`));
INSERT INTO tempTable(session_id) SELECT * FROM session_ids;
提前谢谢你
【问题讨论】:
【参考方案1】:如果您运行的是 mysql 8.0,一种选择是使用递归查询来拆分分隔字符串:
delimiter //
create procedure migrate_session_ids(in session_ids longtext)
begin
create temporary table temptable (
id int not null auto_increment,
session_id bigint,
primary key (id)
);
insert into temptable(session_id)
with recursive all_ids as (
select
0 + substring(concat(session_ids, ','), 1, locate(',', concat(session_ids, ',')) -1) id,
substring(concat(session_ids, ','), locate(',', concat(session_ids, ',')) + 1) rest
union all
select
0 + substring(rest, 1, locate(',', rest) - 1),
substring(rest, locate(',', rest) + 1)
from all_ids
where locate(',', rest) > 0
)
select id from all_ids;
end//
Demo on DB Fiddle:
call migrate_session_ids('1,4,7');
select * from temptable;
| id | session_id |
| --- | ---------- |
| 1 | 1 |
| 2 | 4 |
| 3 | 7 |
【讨论】:
感谢您的快速回复。我正在运行 MySQL 5.7 并使用 mysql workbench 8.0。我收到此错误:>【参考方案2】:在我的情况下,重复查询不起作用,因为我运行 MySQL 5.7,并且我对这个 MySQL 版本在网络上的解决方案(这个转换)感到困惑。 所以,最后我想出了一个使用'concat'和这样的动态查询的解决方案,并想分享它以防有人遇到类似问题:
SET @sql = concat('INSERT INTO tempTable(session_id) SELECT id_session FROM Notes WHERE id_session IN (',session_ids,')');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
【讨论】:
以上是关于从mysql 5.7中的变量将多行插入表中的主要内容,如果未能解决你的问题,请参考以下文章