蠕虫复制能快速的往表中增添数据,一般用于表结构稳定性测试。
创建表test1 和 test2:
-- test1
create table test1(
id int not null primary key auto_increment,
name varchar(20),
gender int(1) default 0,
age int(2) not null);
-- test2
create table test2 like test1;
向test1 插入一条数据:
insert into test1 values(default, 'tom', default, 18);
此时test1 有一条记录,test2 没有记录。
对test2 进行蠕虫复制:
1)从test1 获取原始数据(test1 和test2 的表结构必须相同)
insert into test2 select * from test1;
此时,test2 记录数为 1
2)test2 蠕虫复制操作:
INSERT INTO test2 SELECT * FROM test2;
你会发现报错:
mysql> insert into test2 select * from test2;
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
原因就是主角冲突,解决办法,不复制主键:
insert into test2(name,gender,age) select name,gender,age from test2;
此时,test2 记录数为2。
......
重复操作,记录数数量从 1-2-4-8-16-32-64......增长。
例如:
mysql> insert into test2(name,gender,age) select name,gender,age from test2;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> insert into test2(name,gender,age) select name,gender,age from test2;
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> insert into test2(name,gender,age) select name,gender,age from test2;
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> insert into test2(name,gender,age) select name,gender,age from test2;
Query OK, 8 rows affected (0.01 sec)
Records: 8 Duplicates: 0 Warnings: 0
mysql> insert into test2(name,gender,age) select name,gender,age from test2;
Query OK, 16 rows affected (0.01 sec)
Records: 16 Duplicates: 0 Warnings: 0
mysql> select count(*) from test2;
+----------+
| count(*) |
+----------+
| 32 |
+----------+
1 row in set (0.01 sec)
所以,若表有主键并且有自增长,那不复制主键的值即可。
还有一种,主键没有自增长,那不复制主键可以吗?答案是不行。因为主键的前提是不能为空,赋值则发生主键冲突,不赋值则引发非空约束(多谢评论区的老哥,以前没有考虑到这种情况)。
挨踢建议:存储过程循环+蠕虫复制,这个姿势更帅哦!