不小心搞了个bug,差点造成严重事故,记录这血泪教训。
背景
CREATE TABLE `test` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`name` string NOT NULL DEFAULT '' COMMENT '姓名',
`age` int NOT NULL DEFAULT 0 COMMENT '年龄'
)
目的:修改name="小明"的age值,age=18
过程
错误写法
UPDATE test SET age=18
and name='小明'
正确写法:
UPDATE test SET age=18
where name='小明'
后果
对每一行执行,set age = (18 and name=‘小明’)
1、在MySQL中,0被认为是false,非零值被认为是true
2、and作为’与运算符’,进行逻辑判断
3、18->True,name='小明’在每一行做单独判断
4、最终,除了小明的年龄被正确置为18之外,其余人的年龄都是False->置为0
线上这种操作风险太大了,造成了几乎不可逆的后果。总之,吃一堑长一智,下次测试环境看下执行计划,受影响的行有多少,线上操作,慎之又慎!!!
2021-09-26 南京市江宁区九龙湖