首頁 > 軟體

sql語句 update欄位null不能用is null問題

2022-09-28 14:01:12

sql語句 update欄位null不能用is null

update欄位為 null 值時,

要用 

set column = null,

而不是

set column is null

✖ UPDATE tableA set 欄位a is null WHERE欄位b = 條件; 

例:

mysql> UPDATE t SET col3 is null WHERE col1 = 'a';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'is null WHERE col1 = 'a'' at line 1

〇 UPDATE tableA set 欄位a = null WHERE欄位b = 條件;

例:

mysql> UPDATE t SET col3 =  null WHERE col1 = 'a';
Query OK, 1 row affected (0.03 sec)

update更新資料時null欄位是否更新進資料庫總結

情況一:不需要更新進資料庫

方法1:直接用sql語句方式,需要更新哪個欄位就set xxclounm 即可

方法2:使用mybatis帶的方法 updateById(Entry entry),傳入entry物件只設定需要更新欄位即可。

解析:mybatis-plus在update時對null欄位有三種處理策略分別是:

  • IGNORED:0 忽略
  • NOT_NULL:1 非 NULL,預設策略
  • NOT_EMPTY:2 非空

預設策略是忽略null欄位,所以只需要將entry中不需要更新的欄位不做處理即可。注意:如果entry中欄位設定為空字串" " 則會更新進資料庫

方法3:使用updateWapper,其實和方法2原理一樣 如下例子只更新age欄位 ,同樣受更新策略影響:

UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("name","rhb");
User user = new User();
user.setAge(18);
userMapper.update(user, updateWrapper);

情況二:需要更新進資料庫 (推薦方法3)

方法1:直接用sql語句方式,需要更新哪個欄位就set xxclounm 即可

方法2:使用mybatis帶的方法 updateById(Entry entry),傳入entry物件只設定需要更新欄位即可。另外在entry類中需要更新null的欄位上加上註解updateStrategy 如下面例子:

    /**
     * 單位
     */
    @TableField(value = "UNIT", updateStrategy = FieldStrategy.IGNORED)
    private String unit;

或者設定全域性更新策略(按需要設定單個欄位或者全域性)

# yml設定
mybatis-plus:
  global-config:
    db-config:
      field-strategy: not_empty

方法3:使用updateWapper,不受更新策略影響。推薦此方法,設定完策略後別人在不知情情況下可能會在不想設定null時將你設定的欄位更新為空

LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.eq(User::getName, "rhb").set(User::getAge, null);
Integer rows = userMapper.update(null, lambdaUpdateWrapper);

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com