【问题标题】:Most efficient way to fill a table with auto_increment使用 auto_increment 填充表的最有效方法
【发布时间】:2013-11-05 04:54:52
【问题描述】:

我有一个只有一个 ID (INT auto_increment) 的表。 在给定参数之前用条目填充该表的最有效方法是什么?

这是我想出的一个存储过程,但它需要相当长的时间来填充 100000 条记录:

DELIMITER $$
CREATE PROCEDURE insert_id(
IN createnum INT
)
BEGIN
  DECLARE i INT DEFAULT 1;

  WHILE i < createnum DO
    INSERT INTO table VALUES (i);
    SET i = i + 1;
  END WHILE;
END$$
DELIMITER ;

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    最快的方法是不使用任何循环,只使用纯 SQL

    insert into table1 (id)
    select a.N + b.N * 10 + c.N * 100 + d.N * 1000 + e.N * 10000 + 1 as N
    from (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) a
          , (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) b
          , (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) c
          , (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) d
          , (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) e
    order by N
    

    此查询插入 100000 行

    这里是SQLFiddle演示


    如果你愿意,你可以把它包装在一个过程中

    CREATE PROCEDURE insert_id(IN _maxid INT)
    insert into table1(id)
    select n
      from
    (
      select a.N + b.N * 10 + c.N * 100 + d.N * 1000 + e.N * 10000 + f.N * 100000 + 1 N
        from (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) a
          , (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) b
          , (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) c
          , (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) d
          , (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) e
          , (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) f
    ) t
     where n <= _maxid;
    

    此过程最多可以填充 1m 行。

    示例用法:

    CALL insert_id(5500);
    CALL insert_id(100000);
    

    你也可以看看这个帖子MySQL: Fill a table within a Stored Procedure efficiently

    【讨论】:

    • 谢谢,如何使它可变?如果我想要 5500 条记录等。
    • 您可以通过应用 where 条件使其可变。查看更新的答案。
    猜你喜欢
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多