2013-11-05 5 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 데모

0을 삽입 당신이 1m 행까지 채울 수 있습니다

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; 

이 절차를 원하는 경우


당신은 절차에 포장 할 수 있습니다.

샘플 사용 :

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

또한이 게시물에 MySQL: Fill a table within a Stored Procedure efficiently

+0

감사를 좀 걸릴 수 있습니다, 어떻게 그것을 변수해야합니까? – user1615573

+0

조건을 적용하여 변수를 변경합니다. 업데이트 된 답변보기 – peterm

관련 문제