matrixorigin / matrixorigin/matrixone
[Compatibility]: ODKU UPDATE returns the wrong LAST_INSERT_ID
- Dominant language
- Go
- Stars
- 1.9k
- Forks
- 311
- Avg merge
- 1d 3h
- Merged PRs (30d)
- 768
Description
## 现象
在 MatrixOne main `99ed717b769e261b842c2f17345bd65865fc1470`,ODKU 因主键冲突转为 UPDATE 时,`LAST_INSERT_ID()` 返回了冲突尝试消耗的下一个自增值,而不是实际更新行的自增主键:
```sql
CREATE TABLE t (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
k VARCHAR(32) UNIQUE,
v INT
);
INSERT INTO t(k,v) VALUES ('x',10); -- id=1
INSERT INTO t(k,v) VALUES ('x',11)
ON DUPLICATE KEY UPDATE v=VALUES(v);
SELECT LAST_INSERT_ID();
```
当前结果为 `2`(no-op ODKU 时为 `2`,实际更新时下一次返回 `3`),而被更新行的主键始终是 `1`。新行插入时 `LAST_INSERT_ID()` 返回实际新行 id,行为正常。
## 期望
ODKU 发生 UPDATE 时,`LAST_INSERT_ID()` 应返回被更新行的自增主键值;自增序列是否因冲突尝试前进,不应改变该函数对当前语句结果的语义。
MySQL 文档明确说明:含 AUTO_INCREMENT 列的 ODKU 插入或更新行时,`LAST_INSERT_ID()` 返回该 AUTO_INCREMENT 值。
参考:[MySQL INSERT ... ON DUPLICATE KEY UPDATE](https://dev.mysql.com/doc/refman/8.4/en/insert-on-duplicate.html)
## 影响
依赖 `LAST_INSERT_ID()` 获取 upsert 行 ID 的应用会拿到不存在或尚未插入的自增值,导致后续更新、关联或缓存写入错误。
## 复现信息
- MatrixOne main: `99ed717b769e261b842c2f17345bd65865fc1470`
- 重复执行 3 次,结果一致
Contributor guide
Assessment
This issue has not been assessed yet.