2013-11-05 43 views
0

我有一個只有ID(INT auto_increment)的表格。 什麼是最有效的方式來填充表的條目,直到給定的參數?用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 ; 

回答

0

將不使用任何循環的最快方式,只需使用純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

+0

謝謝,我怎麼讓它變?如果我想要5500條記錄等 – user1615573

+0

你可以通過應用條件來使它變化。查看更新的答案。 – peterm