准备表和测试数据:
CREATE TABLE `t` ( `id` int(11) NOT NULL, `age` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `t_copy` ( `id` int(11) NOT NULL, `age` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- t_copy 创建两条条数据 INSERT INTO t_copy VALUES (3, 30, 'c'),(4, 22, 'd');
insert into values:
INSERT INTO t(id,age,name) VALUES (1, 20, 'a'), (2, 26, 'b');
insert into select:
-- 两张表的字段要一一对应 INSERT INTO t(id,age,name) SELECT id,age,name from t_copy where id < 10;
结果:
1 20 a 2 26 b 3 30 c 4 22 d
注意:insert into values 或 insert into select批量插入时,都满足事务的原子性与一致性,一条出错整体都会回滚。在使用insert into select时,MySQL会对select的数据加S(读)锁,在事务较为复杂的场景下可能有死锁的风险。
参考:MySQL批量插入与更新