我在MySQL的insert ignore into........
使用PythonMySQL的 - 插入後忽略得到主鍵
運行,我想知道該行的主鍵查詢後運行查詢。我知道有查詢
SELECT LAST_INSERT_ID();
但我不知道是否會與插入工作忽略
什麼是做到這一點的最好方法是什麼?
我在MySQL的insert ignore into........
使用PythonMySQL的 - 插入後忽略得到主鍵
運行,我想知道該行的主鍵查詢後運行查詢。我知道有查詢
SELECT LAST_INSERT_ID();
但我不知道是否會與插入工作忽略
什麼是做到這一點的最好方法是什麼?
The documentation爲LAST_INSERT_ID()
說:
如果使用INSERT忽略和行被忽略,則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
保持舊行數據的主ID將會增加,REPLACE
與新行的數據替換它警告:如果之前有類似的插入,而DID具有last_insert_id(),那麼將返回該值,而這會破壞您的算法。換句話說,如果你插入ignore,並且發生了一個實際的插入(比如值3),然後再次插入ignore,last_insert_id()將返回3. – 2015-02-03 22:20:07
@JamiesonBecker:這與直接相反文檔說(和我看到這個代碼在做什麼)。在你的例子中,根據文檔,'LAST_INSERT_ID()'將返回'0'。我能找到的唯一相關部分是'如果前面的語句返回一個錯誤,則LAST_INSERT_ID()的值是未定義的。對於事務表,如果語句由於錯誤而回滾,則LAST_INSERT_ID()的值將保留爲undefined.'這與您聲稱的非常不同。請爲您的索賠提供證據。 – Piskvor 2015-02-04 12:40:57
對不起,@Piskvor,'undefined'表示沒有定義,不是0,但你說得對,這就是文檔所說的。該文檔是明確的,但顯然是錯誤的,至少對於MySQL 5.5.41來說。最後插入的ID不會被清除,或者在忽略插入時被重置爲0,但返回先前的值。證據,請親自嘗試:pastebin.com/KQaCQABR – 2015-02-05 15:54:15
請嘗試使用重複鍵而不是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?
試試吧。它應該工作。讓我們知道它是否不 – Jai 2011-06-09 10:37:08
看到這個:http:// stackoverflow。com/questions/778534/mysql-on-duplicate-key-last-insert-id – 2013-07-30 11:27:27
不幸的是,儘管有相反的官方文檔,但它不起作用。 'INSERT IGNORE'後跟'LAST_INSERT_ID()'將返回最後插入的ID(如果在同一會話中沒有插入,則返回0)。請參閱示例:pastebin.com/KQaCQABR – 2015-02-05 15:57:06