MySQL更新语句中被更新字段作为判断条件,值是取更新前还是更新后?

MySQL更新语句中被更新字段作为判断条件值是更新前还是更新后?

update demo
set
    qty = 1,
    remark = if(qty>=0,'大于等于0','小于0')
where
    id = 1000;

即上述update语句,if中的qty是变更前的的值-1,还是变更后的值1?

经过测试验证,答案是:qty的取值与赋值的顺序有关,把它理解成一个update函数,每个字段是一行,顺序执行,取当前变量最新的值。也就是说上述例子,qty的取值是变更后的1,而下面的写法则是变更前-1。

update demo
set
    remark = if(qty>=0,'大于等于0','小于0'),
    qty = 1
where
    id = 1000;

可以使用下面的sql进行测试:

  • 结果为变更后
-- 建表
drop table if exists `demo`;
create table `demo`(
    `id` bigint(20) not null auto_increment comment '主键id',
    `qty` int(4) not null default '0' comment '数量',
    `remark` varchar(32) not null default '' comment '备注',
    primary key (`id`)
) engine=innodb auto_increment=1000 default charset=utf8mb4 comment='demo表';

-- 插入测试数据
insert into demo (qty,remark) values (-1,'');

-- 更新语句
update demo
set
    qty = 1,
    remark = if(qty>=0,'大于等于0','小于0')
where
    id = 1000;

-- 查看结果
select * from demo where id = 1000;
  • 结果为变更前
-- 建表
drop table if exists `demo`;
create table `demo`(
    `id` bigint(20) not null auto_increment comment '主键id',
    `qty` int(4) not null default '0' comment '数量',
    `remark` varchar(32) not null default '' comment '备注',
    primary key (`id`)
) engine=innodb auto_increment=1000 default charset=utf8mb4 comment='demo表';

-- 插入测试数据
insert into demo (qty,remark) values (-1,'');

-- 更新语句
update demo
set
    remark = if(qty>=0,'大于等于0','小于0'),
    qty = 1
where
    id = 1000;

-- 查看结果
select * from demo where id = 1000;