Birden fazla satır için son eklenen kimlikleri alınıyor

2 Cevap php

Otomatik artan PK olan bir tabloya veri eklerken, ben başka bir deyimi kullanmak için bu anahtarı elde etmek için gerekir. Gibi birçok soru SO bu mysql_insert_id() kullanarak PHP yapılabilir göstermek.

Ancak, ben bu yüzden ben bir defada birden fazla satır eklemek birlikte benim ekler gruplama edilmiştir. Herhalde ben yanlış isem bazı performans sorunu, lütfen bildiriniz olacağını tahmin olarak ben yaptım. Ben tüm eklenen satırlar için kimlikleri gerektiğinde Neyse, bildiğim kadarıyla benim gibi Ancak, mysql_insert_id(), sadece son id döndürür.

Elimden bu durumda sanırım:

  1. mysql_insert_id() ve ben girmiş satır sayısını kullanarak tüm kimlikleri hesaplamak için bazı basit matematik yapmak. Ama bu sürekli doğru garantilidir?

  2. Birden insert ifadeleri, her satır için birini kullanın

  3. Benim kimlikleri öncesi ve hiçbir kullanımı otomatik artış oluşturun.

Ben bu klasik bir sorun olmalı eminim, bu yüzden en yaygın ve tavsiye yaklaşımlar ne merak ediyorum.

2 Cevap

Last_insert_id arama () size son toplu takılı İLK satırın id verir. Takılı Tüm diğerleri, sıralı olması garanti edilir.

Çok garip bir şey yapıyoruz sürece, bu kolayca yeterli her satırın kimliğini calulate sağlar.

Aslında davranış innodb otomatik artış modu parametresinin ayarına bağlı olarak 5.1 değişir; Bu önemli olmamalı. Sürece varsayılan değiştirmek yok gibi, beklenen davranışı görürsünüz.

Böyle bir ON YİNELENEN KEY UPDATE yapmak veya GÖRMEZDEN INSERT gibi - bu ne beklediğiniz yapmak değil ve kullanışlı degildir sıra durumlar vardır. Bu durumda, her bir satır kimlikleri dışında çalışmak için başka bir şey yapmanız gerekir.

Ama düz vanilya INSERT parti için, oto-inc sütun için belirtilen herhangi bir değer, çok kolay.

Nasıl auto-increments are handled in innodb is here tam bir tanımı

Bana olsaydı ben kullanmak istiyorum yaklaşımların bir çift vardır:

İlk olarak, CURRENT_TIMESTAMP yöntemi bir varsayılan CreateDate alan var. CURRENT_TIMESTAMP, tarihi almak ekleme çalıştırın ve ardından select id from table where CreateDate > $mytimestamp için aslında seçin.

İkincisi, after insert log ve biraz denetim tabloya yeni kimlikleri koymak için masada bir tetikleyici oluşturmak olabilir. Olsa da, bu kimlikleri kontrol etmeden önce tablo kesecek. Tablo milyonlarca satır milyonlarca üzerine ise ben bu yöntemi kullanabilirsiniz.