mysql - 插入后忽略获取主键

Joh*_*ohn 21 mysql

我正在insert ignore into........使用Python 在mysql中运行查询

运行查询后,我想知道该行的主键.我知道有查询

SELECT LAST_INSERT_ID();
Run Code Online (Sandbox Code Playgroud)

但我不确定它是否适用于插入忽略

做这个的最好方式是什么?

Pis*_*3.0 32

文档LAST_INSERT_ID()说:

如果使用INSERT IGNORE并忽略该行,则AUTO_INCREMENT计数器不会递增,LAST_INSERT_ID()将返回0,这表示未插入任何行.

知道了这一点,你可以把它变成一个多步骤的过程:

  • INSERT IGNORE
  • 如果LAST_INSERT_ID(),则完成(插入新行)
  • 否则从yourtable WHERE(插入数据的UNIQUE约束)中选择your_primary键

美国州的示例:

id  | abbrev | other_data
 1  | AL     | ...
 2  | AK     |

UNIQUE KEY abbr (abbrev)
Run Code Online (Sandbox Code Playgroud)

现在,插入一个新行:

INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AZ','foo bar');
> OK
SELECT LAST_INSERT_ID();
> "3"
// we have the ID, we're done
Run Code Online (Sandbox Code Playgroud)

插入一个将被忽略的行:

INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AK','duplicate!');
> OK
SELECT LAST_INSERT_ID();
> "0"
// oops, it already exists!
SELECT id FROM `states` WHERE `abbrev` = 'AK'; // our UNIQUE constraint here
> "2"
// there we go!
Run Code Online (Sandbox Code Playgroud)

或者,有一种可能的解决方法是一步完成 - 使用REPLACE INTO而不是INSERT IGNORE INTO- 语法非常相似.但请注意,此方法存在副作用 - 这些可能对您有用,也可能不重要:

  • REPLACE删除+重新创建行
    • 所以DELETE触发器被触发了
    • 此外,即使该行存在,主ID也会增加
    • INSERT IGNORE保留旧的行数据,REPLACE用新的行数据替换它

  • 警告:如果在DID具有last_insert_id()之前存在类似的插入,则将返回该值,这将破坏您的算法.换句话说,如果你插入ignore`并且发生了一个实际的插入(比如值3),然后再次`insert ignore`而没有改变,last_insert_id()将返回3. (7认同)

Tim*_*nen 17

尝试使用ON DUPLICATE KEY而不是INSERT IGNORE,这可能对您有用:

INSERT INTO your_table (`id`,`val`) VALUES(1,'Foo') ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(`id`);

SELECT LAST_INSERT_ID();
Run Code Online (Sandbox Code Playgroud)

另请参阅相关问题:MySQL ON DUPLICATE KEY - 最后一次插入ID?