【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

花花不会敲代码:

也就是说他没有根据已经存在的主键来更新,而是全部替换,