我正在使用Python
在mysqlinsert ignore into........
中运行查询
运行查询后,我想知道该行的主键。我知道有查询
SELECT LAST_INSERT_ID();
但我不确定它是否适用于insert ignore
这样做的最佳方式是什么?
答案 0 :(得分:30)
LAST_INSERT_ID()
的{p> The documentation说:
如果使用INSERT IGNORE并忽略该行,则AUTO_INCREMENT计数器不会递增,LAST_INSERT_ID()将返回0,这表示没有插入任何行。
了解这一点,您可以将其分为多个步骤:
美国州的例子:
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。但请注意,这种方法存在副作用 - 这些对您来说可能对您有用,也可能不重要:
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();