2011-06-09 28 views
16

i satırın birincil anahtar bilmek istediğiniz sorguyu çalıştırdıktan sonra Pythonmysql - ekledikten sonra birincil anahtarı alamazsınız

kullanarak insert ignore into........ mysql sorgu çalıştırıyorum. Ben sorgu olduğunu biliyorum

SELECT LAST_INSERT_ID(); 

ama görmezden eki ile çalışacaktır eğer emin değilim

Bunu yapmanın en iyi yolu nedir?

+2

Deneyin:

INSERT INTO your_table ('id','val') VALUES(1,'Foo') ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID('id'); SELECT LAST_INSERT_ID(); 

Ayrıca ilgili soruya bakın. İşe yaramalı. – Jai

+0

değilse bunu bize bildirin: http: // stackoverflow.com/questions/778534/mysql-on-duplicate-key-son-insert-id –

+1

Ne yazık ki, resmi belgelere rağmen aksine çalışmayacak; 'INSERT IGNORE' tarafından takip edilen 'LAST_INSERT_ID()', son eklenen kimliği (veya aynı oturumda bir ekleme olmasaydı 0'ı) döndürür. Örnek: pastebin.com/KQaCQABR –

cevap

26

The documentation diyor ki:

INSERT IGNORE kullanmak ve satır göz ardı edilirse, AUTO_INCREMENT sayaç artırılır ve LAST_INSERT_ID() hiçbir satır eklendiğini yansıtır ki, 0 değerini döndürür.

  • INSERT başka
  • LAST_INSERT_ID(), sonra yapılırsa (yeni satır yerleştirilmiştir)
  • your_primary anahtarı SEÇ IGNORE:

Bunu bilerek, bu çok adımlı bir işlemi yapabilirsiniz yourtable DAN ABD ile

Örnek (sizin eklenen verinin UNIQUE kısıtlamaları) devletler NEREDE:

göz ardı edilecektir bir satır ekleme

INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AZ','foo bar'); 
> OK 
SELECT LAST_INSERT_ID(); 
> "3" 
// we have the ID, we're done 

: yeni bir satır ekleme Şimdi

id | abbrev | other_data 
1 | AL  | ... 
2 | AK  | 

UNIQUE KEY abbr (abbrev) 

,

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! 

Alternatif olarak, tek adımda bunu yapmak olası bir geçici çözüm vardır - kullanım INSERT IGNORE INTO - the syntax is very similar yerine REPLACE INTO. yan etkileri bu yaklaşımla olduğunu ancak Not - Bu veya sizin için önemli olabilir veya olmayabilir:

  • +
    • böylece tetikleyiciler um olan SİL satır yeniden siler DEĞİŞTİRİN
    • tetikledi
    • ayrıca, birincil kimlik REPLACE yeni satır verilerle değiştirir, sıra
    • INSERT IGNORE eski satır verileri tutar varsa bile artırılır edilecek
+7

UYARI: DID'nin bir last_insert_id() öğesine sahip olduğu benzer bir ek varsa, bunun yerine bu değer döndürülecek ve bunun yerine algoritmanız bozulacaktır. Başka bir deyişle, 'ignore' eklerseniz ve gerçek bir eklenti oluşursa (örneğin 3) ve sonra 'no ignore' tekrar değiştirilmezse, last_insert_id() 3 döndürür. –

+1

@JamiesonBecker: Bu tam olarak belgelere (ve bu kodu ne yaptığımı görüyorum) yazıyor. Örneğinizde 'LAST_INSERT_ID()' dokümantasyona göre '0' döndürecektir. Bulabildiğim tek parça 'Önceki ifadenin bir hata vermesi durumunda LAST_INSERT_ID() değeri tanımsızdır. Işlem tabloları için, deyim bir hata nedeniyle geri alınırsa, LAST_INSERT_ID() değeri undefined.' olarak belirttiğinizden çok farklıdır. Lütfen talebiniz için kanıt sağlayın. – Piskvor

+0

Üzgünüm, @Piskvor, 'undefined', 0 değil tanımlanmış demektir, ancak belgelerin söyledikleri doğrudur. Belgeleme, en azından MySQL 5.5.41 için net değil, açıkça yanlıştır. Son eklenen ID'ler yok sayılmazlar veya yok sayılırlarsa sıfırlanırlar, ancak önceki değer döndürülür. Kanıt, kendiniz deneyin: pastebin.com/KQaCQABR –

İlgili konular