sql - 如果未提供不受影响的值,则插入重复键失败?
问题描述
今天我在 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
?
解决方案
推荐阅读
- python - 查找 Contour opencv 时缺少部分轮廓(受白色背景、文档扫描仪影响)
- reactjs - react-select-search 不允许我选择多个值
- reactjs - React Native:如何防止在未挂载的组件上更新状态导致的内存泄漏。状态在收到api响应后更新?
- java - Java Sound API 如何避免回声?
- r - 如何在没有 install_version() 的情况下安装特定版本的 R 包同时安装依赖项?
- c# - 计算数组中的数字(运行长度解码)
- html - 如何在占位符后将光标定位在搜索字段中
- javascript - 一个文本出现两次 puppeteer
- java - 将属性中的值注入接口字段
- windows - 突然,NPM 脚本变量不再起作用