matrixorigin / matrixorigin/matrixone

[Compatibility]: ODKU UPDATE returns the wrong LAST_INSERT_ID

Open
#28,162 2 comments 0 reactions 1 assignee Claimed by @VioletQwQ-0 View on GitHub
kind/bug severity/s1
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.