首页 > 解决方案 > 如果未提供不受影响的值,则插入重复键失败?

问题描述

今天我在 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 甚至不是 null (当前值为1),没有任何行friendly 没有值,我们甚至没有更新查询中的这一列。

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

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

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

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

标签: sqlmariadbinsert-updatemariadb-10.3

解决方案


推荐阅读