今天我在 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
?