mysql根据条件做特定的更新

有时,光普通的更新操作已经不能满足我们的需求,我们需要根据不同的条件做特定的更新。例如说,某个字段直接普通更新,另外的字段,需要根据条件更新,下面请看一个例子。

原表数据:



需求:

1、所有记录,IS_ENABLE 字段改为1。

2、id 最大的那条记录,IS_ENABLE时间更改为“2017-09-09 09:09:09”,其余的记录,时间更改为“2017-01-01 00:00:00”


SQL语句如下:

update t_iov_user_car_info set IS_ENABLE=1,
LAST_UPDATED_DATE=
( 
 case when id=(select a.id from (select max(id) id from t_iov_user_car_info uc where uc.USER_ID_CARD=4) a) 
 then '2017-09-09 09:09:09' 
 else '2017-01-01 00:00:00' end
)
 where USER_ID_CARD=4

执行结果:

可以看到,IS_ENABLE字段 数据已经全部改为1了,这里是普通更改操作。

其他记录,时间改成了:2017-01-01 00:00:00,而id最大(id=233)的那条记录,时间改为了:2017-09-09 09:09:09。

这就是做到特定更新了。


SQL解析:

其中,语句:

select max(id) id from t_iov_user_car_info uc where uc.USER_ID_CARD=4 
是为了查询最大的 id。那么为什么在这个语句前面加

select a.id from?是因为mysql 不能先select出同一表中的某些值,再update这个表(在同一语句中),否则会报错:

"You can't specify target table for update in FROM clause”。

解决办法就是将select出的结果再通过中间表select一遍,这样就规避了错误。

注意,这个问题只出现于mysql,mssql和oracle不会出现此问题。


下面这个SQL语句:

LAST_UPDATED_DATE=
( 
 case when id=(select a.id from (select max(id) id from t_iov_user_car_info uc where uc.USER_ID_CARD=4) a) 
 then '2017-09-09 09:09:09' 
 else '2017-01-01 00:00:00' end
)

它的意思很明确,相当于java代码:

if(id=最大){
LAST_UPDATED_DATE='2017-09-09 09:09:09' ;
}else{
LAST_UPDATED_DATE='2017-01-01 00:00:00' ;
}

OK, That's all。


猜你喜欢

转载自blog.csdn.net/u012660464/article/details/78615916