在插入重复键后检索自动增量值
Retrieving an autoincrement value after INSERT duplicate key
我有一个 mySQL 5.7 myISAM table 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();
但 LAST_INSERT_ID()
不会 return B 当在重复键上忽略 INSERT 时。
有没有一种简单的方法可以在不锁定的情况下以原子方式完成此操作?
我认为 LAST_INSERT_ID()
没有办法做到这一点,因为只有在实际插入内容并分配新 ID 时才会设置。您必须 select 您刚刚插入的密钥:
INSERT IGNORE INTO T SET a=x, C=y;
SELECT B FROM T WHERE a = x;
select max(id) from T
这个 select 最后一个 ID table
参见 IODKU UPDATE
部分中如何使用 id=LAST_INSERT_ID(id)
的示例。 https://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html
我有一个 mySQL 5.7 myISAM table 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();
但 LAST_INSERT_ID()
不会 return B 当在重复键上忽略 INSERT 时。
有没有一种简单的方法可以在不锁定的情况下以原子方式完成此操作?
我认为 LAST_INSERT_ID()
没有办法做到这一点,因为只有在实际插入内容并分配新 ID 时才会设置。您必须 select 您刚刚插入的密钥:
INSERT IGNORE INTO T SET a=x, C=y;
SELECT B FROM T WHERE a = x;
select max(id) from T
这个 select 最后一个 ID table
参见 IODKU UPDATE
部分中如何使用 id=LAST_INSERT_ID(id)
的示例。 https://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html