记一次批量更新整型类型的列 → 探究 UPDATE 的使用细节( 二 )


使用场景很少,混个眼熟就好
IGNORE UPDATE 的修饰符之一,用来声明 SQL 执行时发生错误的处理方式
如果没有使用 IGNORE  ,  UPDATE 执行时如果发生错误会中止,如下所示

记一次批量更新整型类型的列 → 探究 UPDATE 的使用细节

文章插图
 9002 更新成 9003 的时候,主键冲突,整个 UPDATE 中止, 9000 更新成的 9001 会回滚, 9003 ~ 9005 还未执行更新
如果使用 IGNORE  , 会是什么情况了?
记一次批量更新整型类型的列 → 探究 UPDATE 的使用细节

文章插图
 UPDATE 执行期间即使发生错误了,也会执行完成,最终返回受影响的行数
上述返回受影响的行是 2  , 你们说说是哪两行修改了?
更多关于 IGNORE 的信息,请查看:The Effect of IGNORE on Statement Execution
关于使用场景,在新旧系统并行 , 做数据迁移的时候可能会用到,主键或者唯一键冲突的时候直接忽略
ORDER BY如果大家对 UDPATE 的执行流程了解的话,那就更好理解了
 UPDATE 其实有两个阶段: 查阶段 、 更新阶段
一行一行的处理,查到一行满足 WHERE 子句,就更新一行
所以,这里的 ORDER BY 就和 SELECT 中的 ORDER BY 是一样的效果
关于使用场景 , 大家可以回过头去看看前面讲到的的需求背景,
IGNORE 的案例 1 中的报错,其实也可以用 ORDER BY
记一次批量更新整型类型的列 → 探究 UPDATE 的使用细节

文章插图
LIMIT LIMIT row_count 子句是行匹配限制 。一旦找到满足 WHERE 子句的 row_count 行 , 无论这些行是否实际更改,该语句都会立即停止
也是就说 LIMIT 限制的是 查阶段 ,与 更新阶段 没有关系
记一次批量更新整型类型的列 → 探究 UPDATE 的使用细节

文章插图
注意:与 SELECT 语法中的 LIMIT
记一次批量更新整型类型的列 → 探究 UPDATE 的使用细节

文章插图
还是有区别的
value DEFAULT
记一次批量更新整型类型的列 → 探究 UPDATE 的使用细节

文章插图
 UPDATE 中 SET 子句的 value 是表达式,我们可以理解 , 这个 DEFAULT 是什么意思?
我们先来看这么一个问题,假设某列被声明了 NOT NULL  , 然而我们更新这列成 NULL
记一次批量更新整型类型的列 → 探究 UPDATE 的使用细节

文章插图
会发生什么
记一次批量更新整型类型的列 → 探究 UPDATE 的使用细节

文章插图
我们看下 SQL_MODE ,执行 SELECT @@sql_mode; 得到结果
记一次批量更新整型类型的列 → 探究 UPDATE 的使用细节

文章插图
 STRICT_TRANS_TABLES 表明启动了严格模式 , 对 INSERT 和 UPDATE 语句的 value 管控会更严格
如果我们关闭严格模式,再看看执行结果
记一次批量更新整型类型的列 → 探究 UPDATE 的使用细节

文章插图
 name 字段声明成了 NOT NULL  , 非严格 SQL 模式下,将 name 设置成 NULL 是成功的,但更改的值并非 NULL ,而是 VARCHAR 类型的默认值: 空字符串('')
小结下
1、严格 SQL 模式下,对 NOT NULL 的字段设置 NULL  , 会直接报错,更新失败
2、非严格 SQL 模式下,对 NOT NULL 的字段设置 NULL  , 会将字段值设置字段类型对应的默认值
关于字段类型的默认值,可查看:Data Type Default Values
关于 sql_mode  , 可查看:Server SQL Modes
通常情况下,生成环境的 MySQL 一般都是严格模式,所以大家知道有 value DEFAULT 这回事就够了
SET 字段顺序针对如下 SQL
记一次批量更新整型类型的列 → 探究 UPDATE 的使用细节

文章插图
想必大家都很清楚
然而,以下 SQL 中的 name 列的值会是多少
记一次批量更新整型类型的列 → 探究 UPDATE 的使用细节

推荐阅读