【Easylive】MyBatis 批量插入或更新语句解析insertOrUpdateBatch
苏格拉没有底_coder:
如果fileid不为空的话,那就主键冲突,应该是不会触发SQL的插入操作,触发的是更新操作,而更新只更新指定的字段
【Easylive】MyBatis 批量插入或更新语句解析insertOrUpdateBatch
花花不会敲代码:
Integer index = 1;
for (VideoInfoFilePost videoInfoFile : uploadFileList) {
videoInfoFile.setFileIndex(index++);
videoInfoFile.setVideoId(videoId);
videoInfoFile.setUserId(videoInfoPost.getUserId());
if (videoInfoFile.getFileId() == null) {
videoInfoFile.setFileId(StringTools.getRandomString(Constants.LENGTH_20));
videoInfoFile.setUpdateType(VideoFileUpdateTypeEnum.UPDATE.getStatus());
videoInfoFile.setTransferResult(VideoFileTransferResultEnum.TRANSFER.getStatus());
}
}
this.videoInfoFilePostMapper.insertOrUpdateBatch(uploadFileList);
所以保存视频那里的这段代码,没有设置路径,大小信息,也会被更新为null吧,那第二次在进行更新岂不是获取不到文件路径了,就是现实找不到文件,你没有这个问题嘛,我是有的,是我那里有问题嘛
【Easylive】MyBatis 批量插入或更新语句解析insertOrUpdateBatch
苏格拉没有底_coder:
这个是如果主键存在,定义更新的name和age属性为空的话会更新为空,其他的属性不进行更新吧
【Easylive】MyBatis 批量插入或更新语句解析insertOrUpdateBatch
花花不会敲代码:
是的,使用您提供的写法:
```sql
INSERT INTO table (id, name, age)
VALUES (1, 'John', NULL)
ON DUPLICATE KEY UPDATE name = VALUES(name), age = VALUES(age);
```
**当主键已存在时,数据库确实会将NULL值更新到对应字段中**。这是因为:
1. `VALUES(name)` 和 `VALUES(age)` 会直接获取INSERT部分传入的值(包括NULL)
2. UPDATE部分会无条件地将这些值赋给对应字段
3. 因此,如果传入的age是NULL,数据库中的age字段就会被更新为NULL
## 验证示例
假设表中已有一条记录:`(id=1, name='Alice', age=30)`
执行您的SQL后:
- 由于id=1已存在,会触发ON DUPLICATE KEY UPDATE
- name会被更新为'John'
- age会被更新为NULL(覆盖原来的30)
deepseek说确实会把null值传入数据库更新
【Easylive】MyBatis 批量插入或更新语句解析insertOrUpdateBatch
花花不会敲代码:
也就是说他没有根据已经存在的主键来更新,而是全部替换,