不灭的焱

革命尚未成功,同志仍须努力下载JDK17

作者:Albert.Wen  添加时间:2020-12-12 23:07:54  修改时间:2024-03-28 08:21:20  分类:MySQL/Redis  编辑

准备表和测试数据:

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批量插入与更新