mysql-插入后忽略获取主键
我正在mysql中使用Python运行一个查询 运行查询后,我想知道行的主键。我知道有疑问mysql-插入后忽略获取主键,mysql,Mysql,我正在mysql中使用Python运行一个查询 运行查询后,我想知道行的主键。我知道有疑问 SELECT LAST_INSERT_ID(); 但我不确定它是否能与insert ignore一起工作 执行此操作的最佳方法是什么?对于最后一次插入\u ID()说: 如果使用INSERT IGNORE并忽略该行,则自动增量计数器不会递增,并且LAST_INSERT_ID()返回0,这表示未插入任何行 了解这一点后,您可以将此过程分为多个步骤: 插入忽略 如果上次插入ID(),则完成(插入新行) 否
SELECT LAST_INSERT_ID();
但我不确定它是否能与insert ignore一起工作
执行此操作的最佳方法是什么?对于最后一次插入\u ID()
说:
如果使用INSERT IGNORE并忽略该行,则自动增量计数器不会递增,并且LAST_INSERT_ID()返回0,这表示未插入任何行
了解这一点后,您可以将此过程分为多个步骤:
- 插入忽略
- 如果上次插入ID(),则完成(插入新行)
- 否则,请从表中选择_主键,其中(插入数据的唯一约束)
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
-。但是请注意,这种方法会产生副作用,这些副作用可能对您很重要,也可能对您不重要:
- 替换删除+重新创建行
- 所以删除触发器是,嗯,触发的
- 此外,即使行存在,主ID也将增加
保留旧行数据,INSERT IGNORE
将其替换为新行数据REPLACE
INSERT INTO your_table (`id`,`val`) VALUES(1,'Foo') ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(`id`);
SELECT LAST_INSERT_ID();
另请参见相关问题:试试看。它应该会起作用。让我们知道,如果它不这样做:不幸的是,它不会工作,尽管官方文件相反
INSERT IGNORE
后跟LAST\u INSERT\u ID()
将返回上次插入的ID(如果同一会话中没有插入,则返回0)。请参阅示例:pastebin.com/KQaCQABRWARNING:如果之前有一个类似的insert,它确实有最后一个_insert_id(),那么将返回该值,这将破坏您的算法。换句话说,如果insert ignore
发生实际插入(假设值为3),然后再次insert ignore
而不做任何更改,最后一个insert\u id()将返回3。@JamiesonBecker:这与文档所说的(以及我看到的代码所做的)直接矛盾。在您的示例中,LAST\u INSERT\u ID()
将返回0
,如文档所示。我能找到的唯一相关部分是,如果前面的语句返回错误,则LAST_INSERT_ID()的值未定义。对于事务表,如果由于错误而回滚语句,则LAST_INSERT_ID()的值将保持未定义状态。
这与您所声明的非常不同。请为您的索赔提供证据。对不起,@Piskvor,undefined
表示未定义,而不是0,但您是对的,文档中是这么说的。文档是明确的,但显然是错误的,至少对于MySQL 5.5.41是这样。在忽略插入时,最后插入的ID不会被清除或重置为0,但会返回上一个值。证据,你自己试试:pastebin.com/kqackabri我知道“未定义”意味着“任何东西都可能存在,包括玛蒂尔达阿姨”;)你粘贴的内容看起来像一个bug。是服务器中的bug还是文档中的bug?我倾向于两者都同意:)