mysql - 插入后忽略获取主键

时间:2011-06-09 10:31:04

标签: mysql

我正在使用Python

在mysql insert ignore into........中运行查询

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

SELECT LAST_INSERT_ID();

但我不确定它是否适用于insert ignore

这样做的最佳方式是什么?

2 个答案:

答案 0 :(得分:30)

LAST_INSERT_ID()的{​​p> The documentation说:

  

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

了解这一点,您可以将其分为多个步骤:

  • INSERT IGNORE
  • 如果是LAST_INSERT_ID(),则完成(插入新行)
  • else SELECT your_primary key FROM yourtable WHERE(插入数据的UNIQUE约束)

美国州的例子:

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

UNIQUE KEY abbr (abbrev)

现在,插入一个新行:

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

插入一个将被忽略的行:

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!

或者,有一种可能的解决方法是一步完成 - 使用REPLACE INTO代替INSERT IGNORE INTO - the syntax is very similar。但请注意,这种方法存在副作用 - 这些对您来说可能对您有用,也可能不重要:

  • REPLACE删除+重新创建行
    • 所以DELETE触发器是,嗯,触发
    • 此外,即使行存在,主要ID也会增加
    • INSERT IGNORE保留旧的行数据,REPLACE将其替换为新的行数据

答案 1 :(得分:13)

尝试使用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();

另请参阅相关问题:MySQL ON DUPLICATE KEY - last insert id?