主键递增不连续解决方法
最近学到了存储过程部分,老师先让我们插入40万条数据,然后再插入400万条数据,助教给我们的提示是先利用for循环跑出40万条数据,然后再copy就行,但是需要改主键的数据(每次copy的时候主键先分别再加40万),emmm,秉承能不多写就绝不多写的人生哲学,为了偷懒,我想的是能否利用设置主键递增的方法,然后每次copy的时候,只需将主键外的其余数据拷贝到新表中,主键可以实现逐次递增。
然后,在我试验的时候,问题来了,我发现插入后的表中数据的主键不太对,以为多插入了数据,找了半天,发现在不同批次插入数据时,主键竟然不是连续递增的,这就是个问题了,至于原因,网上有很多介绍,我在此就不多赘述了(主要是我只是看了个大概,但是不太懂那些专业名词以及具体原理,有需求的小伙伴可以自行百度)
解决方法:只需要在执行新的插入操作时,加上这么一句就可以了
alter table copy1_orders AUTO_INCREMENT=1;
问题和代码我放在下面,可以自行查看:
问题:
要求:
代码:
40万条数据
-- 建表
create table orders1(
id int not null auto_increment primary key,
num int,
hashcode smallint
);
-- 插数据
DELIMITER $$
create procedure insertData()
begin
declare i int default 1;
declare num_o int ;
declare hashnum smallint;
while i<=400000 do
set i=i+1;
set num_o=floor(rand()*5000001);
set hashnum=floor(rand()*10);
insert into orders1(num,hashcode) values(num_o,hashnum);
end while;
end;$$
DELIMITER
/*drop procedure insertData; */
call insertData();
copy400万条数据
create table copy1_orders like orders1;
insert into copy1_orders select * from orders1 ;
DELIMITER $$
create procedure insertData2()
begin
insert into copy1_orders(id,num,hashcode) select null,num,hashcode from orders1;
end;$$
DELIMITER ;
/*drop procedure insertData2; */
-- 解决主键递增不连续的问题
alter table copy1_orders AUTO_INCREMENT=1; -- *************
call insertData2(); -- 连续调用9次即可生成4000000条数据