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行。