56,679
社区成员
发帖
与我相关
我的任务
分享
mysql> create table t (num int not null) engine myisam;
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE PROCEDURE `doloop`()
-> BEGIN
-> DECLARE v INT default 10000;
-> WHILE v > 0 DO
-> insert into t values(v);
-> SET v = v - 1;
-> END WHILE;
-> END$$
Query OK, 0 rows affected (0.01 sec)
mysql>
mysql> DELIMITER ;
mysql>
mysql> call doloop();
Query OK, 1 row affected (0.42 sec)
mysql> select count(*) from t;
+----------+
| count(*) |
+----------+
| 10000 |
+----------+
1 row in set (0.00 sec)
mysql>
mysql> delimiter $;
mysql> drop procedure doloop;
mysql> create procedure doloop(in v int(11))
-> BEGIN
-> truncate table t;
-> while v>0 do
-> insert into t values (v);
-> set v = v-1;
-> end while;
-> end $;
mysql> delimiter ;
mysql> call doloop(100000);
Query OK, 1 row affected (2.42 sec)
mysql> select count(*) from t;
+----------+
| count(*) |
+----------+
| 100000 |
+----------+
1 row in set (0.00 sec)
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`sp_insert_batch`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_insert_batch`(IN number int(11))
BEGIN
declare i int(11);
set i = 1;
-- such as 1-2000,2000-4000,....
WHILE i <= number DO
if mod(i,2000)=1 then
set @sqltext =concat('(',i,')');
elseif mod(i,2000)=0 then
set @sqltext=concat(@sqltext,',(',i,')');
set @sqltext=concat('insert into t values',@sqltext);
prepare stmt from @sqltext;
execute stmt;
DEALLOCATE PREPARE stmt;
set @sqltext='';
else
set @sqltext=concat(@sqltext,',(',i,')');
end if;
set i = i + 1;
END WHILE;
-- process when number is not be moded by 2000
-- such as 2001,4002,15200,...
if @sqltext<>'' then
set @sqltext=concat('insert into t values',@sqltext);
prepare stmt from @sqltext;
execute stmt;
DEALLOCATE PREPARE stmt;
set @sqltext='';
end if;
END$$
DELIMITER ;
表结构:
Table Create Table
------ --------------------------------------
t CREATE TABLE `t` (
`id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
测试结果 :
mysql> call sp_insert_batch(10000);
Query OK, 0 rows affected (0.61 sec)
mysql> select count(*) from t;
+----------+
| count(*) |
+----------+
| 10000 |
+----------+
1 row in set (0.00 sec)