无法更新为 tinyint 和 varchar 字段的默认值 null 和空字符串

unable to update to default values null and empty string for tinyint and varchar fields

我有以下 table 架构 -

CREATE TABLE `tablename` (
  `id` bigint(15) NOT NULL AUTO_INCREMENT,
  `uuid` varchar(400) NOT NULL,
  `pre_notif_action` varchar(30) DEFAULT '',
  `pre_notif_interval` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uuid_UNIQUE` (`uuid`),

  ) ENGINE=InnoDB DEFAULT CHARSET=latin1

对于现有记录,字段 pre_notif_action 和 pre_notif_interval 中的值分别为 "predeactivate" 和 45 -

mysql> select pre_notif_action, pre_notif_interval 
       from tablename 
       where uuid="1887826113857166800";

结果 -

+------------------+--------------------+
| pre_notif_action | pre_notif_interval |
+------------------+--------------------+
| predeactivate    |                 45 |
+------------------+--------------------+

当我尝试编辑时,我得到了非零受影响的行 -

 update prepaid_account 
 set pre_notif_action="" 
     and pre_notif_interval=NULL 
 where  uuid="1887826113857166800";

结果 -

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

然而,当我 select -

mysql> select pre_notif_action, pre_notif_interval 
       from prepaid_account 
       where uuid="1887826113857166800";

我得到这个输出 -

+------------------+--------------------+
| pre_notif_action | pre_notif_interval |
+------------------+--------------------+
| 0                |                 45 |
+------------------+--------------------+

我该如何解决这个问题?

你得到 pre_notif_action = 0 作为结果或逻辑运算:

pre_notif_action="" 
 and pre_notif_interval=NULL

即 return 0(假)

因此您使用的是逻辑操作,而不是更新两列 pre_notif_actionpre_notif_interval 的设置。

更新多个列的正确语法是用逗号分隔值:

 update prepaid_account 
 set pre_notif_action="" 
     , pre_notif_interval=NULL 
 where  uuid="1887826113857166800";

我认为这里的问题是在 SET 子句中使用了 AND。我认为您的查询是这样解释的:

update prepaid_account 
 set pre_notif_action = ("" and pre_notif_interval=NULL)
 where  uuid="1887826113857166800";

("" and pre_notif_interval=NULL) 被解释为布尔值,这就是为什么 0 被插入到字段中的原因(0 相当于 false 中的布尔值 MySQL).要解决此问题,请在 SET 子句中的多个字段之间使用逗号,如下所示:

update prepaid_account 
 set pre_notif_action = "", pre_notif_interval=NULL
 where  uuid="1887826113857166800";