Mysql通过所选列循环,并在循环中执行Insert查询

Mysql通过所选列循环,并在循环中执行Insert查询,mysql,sql,Mysql,Sql,我正在尝试循环选定的段塞,并在SELECT查询中执行一些复杂的INSERT。 slugs[iteration]用法不是正确的mysql语法。但我必须在查询中逐个访问获取的slug。我怎样才能做到这一点 DELIMITER $$ CREATE PROCEDURE create_sitemap_from_slugs() BEGIN SELECT `slug` INTO slugs FROM slug_table; SELECT COUNT(*) INTO count FROM s

我正在尝试循环选定的段塞,并在SELECT查询中执行一些复杂的INSERT。
slugs[iteration]
用法不是正确的mysql语法。但我必须在查询中逐个访问获取的slug。我怎样才能做到这一点

DELIMITER $$
CREATE PROCEDURE create_sitemap_from_slugs()
BEGIN
    SELECT `slug`  INTO slugs FROM slug_table;
    SELECT COUNT(*)  INTO count FROM slug_table;

    SET iteration = 0;

    START TRANSACTION;

        WHILE iteration < count DO

            INSERT INTO line_combinations
                SELECT REPLACE(`line`, '{a}', slugs[iteration]) AS `line`
                FROM line_combinations
                WHERE `line` LIKE CONCAT('%/', '{a}', '%');

            SET iteration = iteration + 1;

        END WHILE;

    COMMIT;


END
$$
DELIMITER ;
分隔符$$
创建过程从\u slugs()创建\u站点地图\u
开始
从slug_表中选择“slug”进入slug;
从slug_表中选择COUNT(*)进入COUNT;
设置迭代=0;
启动交易;
当迭代
顺便说一句,我不想使用任何外部编程语言来实现这一点,这个过程将用于数十亿行。由于性能问题,我认为SQL中的循环不是一个好方法

如果你建议另一种方式,我也会接受


我又问了一个详细的问题,但没有得到答案。如果您还想检查:

那么对于
{a}
的每一行,您需要从slug_表插入
COUNT(*)乘以用
slug
值填充的值

似乎您只需从SELECT插入一次就可以做到这一点

INSERT INTO line_combinations
            (SELECT REPLACE(lc.line, '{a}', st.slug) AS `line`
            FROM line_combinations lc, slug_table st
            WHERE lc.line LIKE CONCAT('%/', '{a}', '%');
更新:

您可以创建临时表
行组合2
并插入所有记录

FROM line_combinations 
WHERE line LIKE CONCAT('%/', '{a}', '%')

进入临时表。然后在INSERT中使用临时表而不是原来的表

现在它说
无法重新打开表:行组合
我认为它在插入时锁定表,流式传输不起作用。您可以创建一个临时表行组合2并插入行组合中的所有记录,行组合中的行类似CONCAT(“%/”、“{a}”、“%”)进入临时表。然后在INSERT中使用临时表,而不是原始表。你是正确的,有5个像{a}这样的占位符。我想可能会有5个或6个临时表,无论如何,我认为没有使这个查询更简单:)你能更新你的答案吗?由于这个更改,我接受你的答案。