【方式1】:单条插入
INSERT INTO t1(field1,field2) VALUE(v001,v002);
【方式2】:批量插入
INSERT INTO t1(field1,field2) VALUES(v101,v102),(v201,v202),(v301,v302),(v401,v402);
【方式3】: 通过复制已有数据,插入,得到新数据
【方式3.1】: 列举所有非空且无默认值的字段
INSERT INTO t2(field1,field2) SELECT colm1,colm2 FROM t1 WHERE ……
这里简单说一下,由于可以指定插入到 t2 中的列,以及可以通过相对较复杂的查询语句进行数据源获取,可能使用起来会更加的灵活一些,但我们也必须注意,我们在指定目标表的列时,一定要将所有非空且无默认值的列都填上,否则将无法进行数据插入,还有一点比较容易出错的地方就是,当我们写成如下简写格式:
【方式3.2】: 默认所有字段
INSERT INTO t2 SELECT colm1,colm2,…… FROM t1
此时,我们如果略掉了目标表的列的话,则默认会对目标表的全部列进行数据插入,且 SELECT 后面的列的顺序 必须和目标表中的列的定义顺序完全一致 才能完成正确的数据插入,这是一个很容易被忽略的地方,值得注意。
【特注】由于插入操作只粗略地对表 t1、t2 按顺序对所有字段进行 [数据类型] 检查,不对 [字段名] 核对。这是把双刃剑,既提供便利,又存在可能因粗心造成风险。在使用中,需确认顺序,使用中建议使用 [方式3.1] 或 [方式4].
【方式3.3】:部分查询,部分设置固定值
INSERT INTO t2 (id, name, salary) SELECT id, name, 5000 AS salary FROM t1 ;
这种方式:从源表中选择部分字段插入到目标表中,同时可能对某些字段赋予自定义的值(完全自定义传值、运用函数处理旧值所得)。
[mybatis 示例]:
INSERT INTO a_news( sys_id, title, summary, content, updater, updater_name, is_enabled)
SELECT sys_id, CONCAT(title, '-COPY'), CONCAT(summary, '-COPY'), content, #{updater}, #{updaterName}, 0
FROM a_news WHERE id = #{id}
[示例说明]:
(1)复制原有的一条记录;
(2)修改部分字段数据(包括传入 [updater、updaterName]、拼接[title、summary]、固定值 [0]);
(3)保留原有字段数据 [sys_id、content]。
本方式的好处是:在只知道id的情况下,减少了一次显式查询(实质未减少,只是放在了insert 语句中)。
【方式4】:set 方式(博友提供,感谢)
INSERT INTO t1 SET field1 = v1, field2 = v2, ...;
不能批量增加数据(参考:mysql数据库中插入数据INSERT INTO SET的优势)