代码之家  ›  专栏  ›  技术社区  ›  Priit

是否可以重构这个MySQL存储过程循环?

  •  1
  • Priit  · 技术社区  · 17 年前

    我在MySQL存储过程中有一个循环,几乎每次迭代都会在其中插入记录。众所周知的问题是逐行插入效率低下,我宁愿看到带有多个值列表的插入。

    当前过程的伪示例:

    CREATE PROCEDURE p_foo_bar()
    BEGIN
      DECLARE foo VARCHAR(255);
      DECLARE my_cursor CURSOR FOR SELECT foo FROM bar;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found = 1;
    
      cursor_loop:
      LOOP
        FETCH my_cursor INTO foo;
    
        IF not_found THEN
          CLOSE my_cursor;
          LEAVE
        END IF;
    
        IF foo is something ... THEN
          INSERT INTO foobar (foo_colum) VALUES (foo);
    
          -- Anyone knows if it is possible to do bulk insert here:
          -- For example:
          -- INSERT INTO foobar (foo_column) VALUES (foo), ..., (foo123);
        END IF;
      END LOOP cursor_loop;
    END
    

    我宁愿看到INSERT查询将它的值列表增长一段时间,然后周期性地进行大量的插入,但如果不烹调一大碗意大利面,就看不到可能的方法。

    4 回复  |  直到 17 年前
        1
  •  1
  •   KM.    17 年前

    试试这个:

     INSERT INTO foobar (foo_column, , ....)
        SELECT foo, ..., foo123
        FROM bar
        WHERE foo is something ...
    
        2
  •  0
  •   lexu    17 年前

    你确定你需要以这种方式在“从栏中选择foo”上迭代吗。。。

    没有办法吗

    insert into foobar (foo_column) 
    select foo 
      from bar 
      where foo is something
    

    ??

        3
  •  0
  •   Kelly S. French    17 年前

    这不仅仅是一个MySQL问题,它出现在任何大的RDBMS中(当然,不包括访问)。你所描述的叫做“集合逻辑”。“if”和“loop”这样的一个好where子句做不到什么?源信息是否会随着时间的推移而改变,并且循环本质上是轮询?如果这是真的,您仍然需要某种循环,但最好使用where子句一次插入尽可能多的行,然后创建一个循环,让您可以随着时间的推移而更新。这种类型的循环最好在存储过程之外。另一个答案已经给出了我建议的一般SQL。

        4
  •  0
  •   Josh    17 年前

    构建一个准备好的语句并在循环之后执行它怎么样

    http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html

    declare @column_names text;
    declare @column_values text;
    

    然后在圈内添加 列名和变量值

    循环完成后,您可以生成查询并执行

    set @sql_text = CONCAT('INSERT INTO foobar (', @column_names, 
                     ') VALUES (', @column_values, ')';
    
    prepare stmt from @sql_text;
    
    execute stmt;
    

    乔希

    推荐文章