从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中的变量将多行插入表中的主要内容,如果未能解决你的问题,请参考以下文章

MySQL如何将变量插入到表中

将两个数组插入到一个mysql表中

在 MySQL PHP 中从多行结果中分离行

MySQL 连接器/Python - 将 python 变量插入 MySQL 表

将数据从多行插入一行mysql

mysql存储过程,选择最大值并插入值并分配给变量