2011-06-09 57 views
16

我在MySQL的insert ignore into........使用PythonMySQL的 - 插入后忽略得到主键

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

SELECT LAST_INSERT_ID(); 

但我不知道是否会与插入工作忽略

什么是做到这一点的最好方法是什么?

+2

试试吧。它应该工作。让我们知道它是否不 – Jai 2011-06-09 10:37:08

+0

看到这个:http:// stackoverflow。com/questions/778534/mysql-on-duplicate-key-last-insert-id – 2013-07-30 11:27:27

+1

不幸的是,尽管有相反的官方文档,但它不起作用。 'INSERT IGNORE'后跟'LAST_INSERT_ID()'将返回最后插入的ID(如果在同一会话中没有插入,则返回0)。请参阅示例:pastebin.com/KQaCQABR – 2015-02-05 15:57:06

回答

26

The documentationLAST_INSERT_ID()说:

如果使用INSERT忽略和行被忽略,则AUTO_INCREMENT计数器不增加和LAST_INSERT_ID()返回0,这反映出没有行插入。

知道了这一点,你可以让这个多步骤的过程:

  • INSERT忽略
  • 如果LAST_INSERT_ID(),那么做(新行已插入)
  • 否则选择your_primary关键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。但是请注意,有副作用这种方法 - 这些可能会或可能不会对你很重要:

  • 替换删除+再现行
    • 所以DELETE触发器,嗯,引发
    • 还,即使行存在
    • INSERT IGNORE保持旧行数据的主ID将会增加,REPLACE与新行的数据替换它
+7

警告:如果之前有类似的插入,而DID具有last_insert_id(),那么将返回该值,而这会破坏您的算法。换句话说,如果你插入ignore,并且发生了一个实际的插入(比如值3),然后再次插入ignore,last_insert_id()将返回3. – 2015-02-03 22:20:07

+1

@JamiesonBecker:这与直接相反文档说(和我看到这个代码在做什么)。在你的例子中,根据文档,'LAST_INSERT_ID()'将返回'0'。我能找到的唯一相关部分是'如果前面的语句返回一个错误,则LAST_INSERT_ID()的值是未定义的。对于事务表,如果语句由于错误而回滚,则LAST_INSERT_ID()的值将保留为undefined.'这与您声称的非常不同。请为您的索赔提供证据。 – Piskvor 2015-02-04 12:40:57

+0

对不起,@Piskvor,'undefined'表示没有定义,不是0,但你说得对,这就是文档所说的。该文档是明确的,但显然是错误的,至少对于MySQL 5.5.41来说。最后插入的ID不会被清除,或者在忽略插入时被重置为0,但返回先前的值。证据,请亲自尝试:pastebin.com/KQaCQABR – 2015-02-05 15:54:15

8

请尝试使用重复键而不是INSERT忽略,也许这可以为你工作:

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?