微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果未提供不受影响的值,则在重复键上插入失败?

如何解决如果未提供不受影响的值,则在重复键上插入失败?

我今天在 MariaDB 10.3.29 上遇到了一个奇怪的行为。

这是有问题的表格:

CREATE TABLE `quick` (
  `userid` int(11) NOT NULL,`room1` varchar(32) NOT NULL,`room2` varchar(32) NOT NULL,`room3` varchar(32) NOT NULL,`room4` varchar(32) NOT NULL,`sounduser` varchar(24) NOT NULL,`soundchannel` varchar(24) NOT NULL,`desktopnotify` int(1) unsigned NOT NULL,`friendly` int(1) unsigned NOT NULL,`poll` int(1) unsigned NOT NULL,`emailnotify` int(1) unsigned NOT NULL,PRIMARY KEY (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

这是一个相对简单的表格。

这是一个当前失败的 sql 查询

INSERT INTO quick (userid,room1,room2,room3,room4,sounduser,soundchannel,desktopnotify,emailnotify) VALUES (?,?,?) ON DUPLICATE KEY
UPDATE room1 = VALUES(room1),room2 = VALUES(room2),room3 = VALUES(room3),room4 = VALUES(room4),sounduser = VALUES(sounduser),soundchannel = VALUES(soundchannel),desktopnotify = VALUES(desktopnotify),emailnotify = VALUES(emailnotify)

查询失败,错误Field 'friendly' doesn't have a default value

显然,friendly 不是上述查询中更新的列之一。奇怪的是,friendly 甚至不为空(当前值是 1),没有任何行的friendly 没有值,我们甚至没有在查询中更新此列。

我知道这与 NOT NULL 约束有关,但该值当前不是 NULL,我们不会更新它以使其为 NULL - 事实上,我们没有触及该列以及它的非空值——那么它为什么要抱怨这个?

我继续修改查询删除其他列,如果没有提供每一列,它基本上会抱怨。

这种行为看起来很奇怪,几乎就好像它试图删除行,然后使用提供的更新值添加数据。常规 UPDATE ... SET 查询工作正常。

我找不到有关此行为的任何文档。为什么查询的行为是这样的?有什么方法可以让它正常工作,还是应该将 ON DUPLICATE KEY UPDATE 换成带有常规 UPDATE 的 3 部分 sql 查询

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。