2011-06-09 61 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?