mysql-插入后忽略获取主键

mysql-插入后忽略获取主键,mysql,Mysql,我正在mysql中使用Python运行一个查询 运行查询后,我想知道行的主键。我知道有疑问 SELECT LAST_INSERT_ID(); 但我不确定它是否能与insert ignore一起工作 执行此操作的最佳方法是什么?对于最后一次插入\u ID()说: 如果使用INSERT IGNORE并忽略该行,则自动增量计数器不会递增,并且LAST_INSERT_ID()返回0,这表示未插入任何行 了解这一点后,您可以将此过程分为多个步骤: 插入忽略 如果上次插入ID(),则完成(插入新行) 否

我正在mysql中使用Python运行一个查询

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

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?我倾向于两者都同意:)