mysql批量插入、更新

1、創建表

CREATE TABLE `user`  (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '姓名',
  `age` int(11) NOT NULL COMMENT '年齡',
  `status` int(11) NOT NULL DEFAULT 0 COMMENT '狀態',
  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `name`(`name`, `age`) USING BTREE
)

添加數據

INSERT INTO `user` VALUES (296, '李四0', 12, 0, '2019-06-25 19:33:26', '2019-06-25 20:42:40');
INSERT INTO `user` VALUES (297, '李四1', 13, 1, '2019-06-25 19:33:26', '2019-06-25 20:42:40');
INSERT INTO `user` VALUES (298, '李四2', 14, 0, '2019-06-25 19:49:55', '2019-06-25 20:42:40');

2、批量更新方式

2.1 使用case when then

>UPDATE USER 
	SET NAME =
CASE
	id 
	WHEN 296 THEN
	"李四10" 
	WHEN 297 THEN
	"李四11" 
	WHEN 298 THEN
	"李四12" 
	END,
	age =
CASE
	id 
	WHEN 296 THEN
	22 
	WHEN 297 THEN
	23
	WHEN 298 THEN
	24
END 
WHERE
	id IN ( 296, 297, 298 );
> Affected rows: 3
> 時間: 0.001s

where的作用:即是將條件語句寫在了一起。這裏的where部分不影響代碼的執行,但是會提高sql執行的效率。確保sql語句僅執行需要修改的行數,這裏只有3條數據進行更新,而where子句確保只有3行數據執行。

mybatis示例:

UPDATE user
<trim prefix="set" suffixOverrides=",">
    <trim prefix="name =case" suffix="end,">
        <foreach collection="list" item="item" index="index">
            <if test="item.name!=null">
                when id=#{item.id} then #{item.dateStart}
            </if>
        </foreach>
    </trim>
    <trim prefix="class_name =case" suffix="end,">
        <foreach collection="list" item="item" index="index">
            <if test="item.className!=null">
                when id=#{item.id} then #{item.className}
            </if>
        </foreach>
    </trim>
</trim>
WHERE id IN
<foreach collection="list" item="item" separator="," open="(" close=")">
    #{item.id}
</foreach>

 

2.2 replace into(不建議)

>REPLACE INTO USER ( NAME, age, `status` )
VALUES
	( '李四10', 22, 110 ),
	( '李四11', 23, 111 ),
	( '李四13', 24, 112 );
> Affected rows: 5
> 時間: 0.002s

先檢測該記錄是否存在(PRIMARY KEY或一個UNIQUE索引),如果存在,先刪除(delete),在插入(insert),受影響爲2行;如果不存在,插入(insert),受影響爲1行。

存在的問題

  • 如果記錄存在,每次執行完,主鍵自增id就變了(相當於重新insert了一條),對於聯表查詢,如果主表的id變了,其它子表沒做好同步,會造成數據不一致。
  • 自增id會跳躍自增,增長過快。

2.3 on duplicate key update

>INSERT INTO USER ( NAME, age, STATUS, update_time )
VALUES
	( '李四10', 22, 11, now( ) ),
	( '李四11', 23, 12, now( ) ),
	( '李四15', 25, 15, now( ) ) 
	ON DUPLICATE KEY UPDATE STATUS =
VALUES
	( STATUS ),
	update_time =
VALUES
	( update_time );
> Affected rows: 5
> 時間: 0.003s

先檢測該記錄是否存在(PRIMARY KEY或一個UNIQUE索引),如果存在,更新(update),只更新需要更新的字段,受影響爲2行;如果不存在,插入(insert),受影響爲1行。

存在問題

  • 自增id會跳躍自增,增長過快。建議id使用如下類型
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT

2.4 insert ignore into(避免重複添加)

>INSERT IGNORE INTO USER ( NAME, age, `status` )
VALUES
	( '李四10', 22, 110 ),
	( '李四11', 23, 111 ),
	( '李四16', 26, 116 );
> Affected rows: 1
> 時間: 0.002s

先檢測該記錄是否存在(PRIMARY KEY或一個UNIQUE索引),如果存在,忽略,受影響爲0行;如果不存在,插入(insert),受影響爲1行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章