【发布时间】:2017-09-24 11:16:06
【问题描述】:
我有一个 mySQL 5.7 myISAM 表 T:
Col Key Other
A PRI
B autoincrement
C
我要执行以下操作: 给定值 x 和 y
- 如果已经存在 A=x 的行,请将 B 还给我
- 否则,在 A=x 和 C=y 的位置插入一行,然后返回 B
这样做的最简单方法似乎是
SELECT B FROM T WHERE A=x;
if the row doesn't exist,
INSERT INTO T SET A=x, C=y;
SELECT LAST_INSERT_ID();
但是,这是非原子的,这意味着我需要实现某种锁定。
我希望我可以使用
INSERT IGNORE INTO T SET A=x, C=y;
SELECT LAST_INSERT_ID();
但是当重复键上的 INSERT 被忽略时,LAST_INSERT_ID() 不会返回 B。
有没有一种简单的方法可以原子地完成此操作,无需锁定?
【问题讨论】:
-
您是否正在处理表中已经存在的数据?插入忽略只是插入带有主键的记录,如果工作表中存在主键则跳过。
-
@reds - 我希望即使在这种情况下它也能返回自动增量字段。但仔细想想,这似乎需要访问数据行,IGNORE 允许我们绕过。
-
停止使用 MyISAM;切换到 InnoDB。
标签: mysql sql-insert auto-increment myisam last-insert-id