2012-02-01 31 views
6

Bir mysql hatası yinelenen bir anahtar döndürdüğünde bir ekin ardından bir kaydın kimliğini (birincil anahtar) almanın bir yolu var mı?mysql yinelenen hata döndürdüğünde kayıt kimliği al

E.G. Bu konuda giderdim Nasıl:

İşte
$sql = "INSERT INTO table (`col1`, `col2`) VALUES ('$val1', '$val2')"; 
$result = mysql_query($sql); 
if($result){ 
    $id = mysql_insert_id(); 
} 
else { 
    if(stristr(mysql_error(), "duplicate"){ 
    $sql = "SELECT `id` FROM `table` WHERE `col1`='$val1' AND `col2`='$val2'"; 
    $result = mysql_query($sql); 
    $row = mysql_fetch_array($result); 
    $id = $row['id']; 
    } 
    else { 
    die(mysql_error()); 
    } 
} 

Ben zaman ve emek alır ama aynı zamanda kod yinelenen sadece iki sql ifadeleri yapmak zorunda kalmıştım.

ON DUPLICATE KEY UPDATE kullanamıyorum çünkü son eklenen kimliği veya çoğaltılamayan kaydın kimliğini kullanarak farklı bir tabloyu güncelleştirmek istiyorum.

Peki, yaptığım şey doğru mu? Ya da satırın kimliğini almanın bir yolu var mı?

Teşekkür

cevap

6

MySQL kendini bulmak gerekecek, orijinal değerini tutan rekor söylemeyeceğim.

  • çok sağlam görünmüyor hata mesajının metninde duplicate alt dize Aranan: Burada bazı ipuçları. Sadece mysql_errno() değerini, çift giriş için 1062 (you can find all codes in the manual) koduna karşı test edebilirsiniz.

    if(preg_match("/Duplicate entry '.*' for key '(.*)'/Ui", mysql_error(), $matches)){ 
        $violated_key = $matches[1]; 
    }else{ 
        throw new Exception('Could not find violated key name'); 
    } 
    
  • : Hata mesajının metnini ayrıştırma olmayan sağlam bir yaklaşım kullanmak gerekecektir böylece

  • mysql uzantısı ihlal anahtarın adını bulmak için bir mekanizma sağlamaz Alternatif olarak, sadece (bunu önlemek için hiçbir neden yoktur) bir önceki sorguyu çalıştırın:

    SELECT id 
    FROM table 
    WHERE col1=... AND col2=... 
    FOR UPDATE 
    

    FOR UPDATE fıkra yarış koşulları (varsayarak InnoDB) önlemek için eşleşen satırları kilitlenir.

+0

Serin, bilgi ve ipuçları için teşekkürler. –

+0

Yardım ettiğine sevindim. Bir not ekleyeyim: Açıkçası, "UPDATE İÇİN" eşleşme olmadığında hiçbir şeyi kilitleyemez. Kontrolden hemen sonra diğer eşzamanlı süreç tarafından oluşturulan kaydı alabilirsiniz. Sadece bunu hesaba kat. –

+0

Tamam, teşekkürler. InnoDB kullanmıyorum ve asla sahip olmadığın için, neden bahsettiğinden emin değilim! : p Ama ona bakmalıyım. :) –