暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql根据条件做特定的更新

Java修炼记 2021-04-07
1801

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


需求:

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。

          文章转载自Java修炼记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论