PHP ile YİNELENEN KEY UPDATE ON kullanırken mysql_insert_id () almak

3 Cevap php

Ben yalnız mySQL kullanarak bu için bir kaç cevap buldum, ama birisi bana ekler / güncelleştirmeleri işlemek için PHP kullanarak bir mysql DB son eklenen veya güncellenen satırın kimliğini almak için bir yol göster umuyordum.

Şu anda column3 eşsiz bir anahtardır böyle bir şey var, ve bir autoincremented birincil anahtar bir kimlik sütun da var:

$query ="INSERT INTO TABLE (column1, column2, column3) VALUES (value1, value2, value3) ON DUPLICATE KEY UPDATE SET column1=value1, column2=value2, column3=value3";
mysql_query($query);

$my_id = mysql_insert_id();

$ My_id INSERT doğru, ama yanlış o (YİNELENEN KEY UPDATE ON) bir satır güncelleştirme olduğunda.

Ben insanlar gibi bir şey kullanmanız danışmanlık ile birkaç mesaj gördüm

INSERT INTO table (a) VALUES (0) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id) 

ON YİNELENEN KEY çağrıldığında, geçerli bir kimlik değerini almak için - ancak bu dönüş o PHP mysql_insert_id() function için geçerli bir kimlik?

3 Cevap

Alexandre tarafından önerilen İşte cevabı, var:

Eğer id kullandığınızda = LAST_INSERT_ID (id) bu mysql_insert_id değerini ayarlar = güncellenen kimliği - böylece son kodu gibi görünmelidir:

$query = "INSERT INTO table (column1, column2, column3) VALUES (value1, value2, value3) ON DUPLICATE KEY UPDATE SET column1 = value1, column2 = value2, column3 = value3, id=LAST_INSERT_ID(id)"; $my_id = mysql_insert_id();

Bu durum güncellemesi ya da ekin $ my_id için doğru değeri dönecektir.

Sorgu bir ekleme veya bir güncelleme olup olmadığını kontrol edebilir (mysql_affected_rows (); güncelleme üzerine ekleme 1 ve 2 döner).

Bir ekleme kullanılması mysql_insert_id ise bir güncelleştirme olup olmadığını, başka bir sorgu gerekiyordu.

<?php
$query ="INSERT INTO TABLE (column1, column2, column3) VALUES (value1, value2, value3) ON DUPLICATE KEY UPDATE SET column1=value1, column2=value2, column3=value3";
mysql_query($query);
if(mysql_affected_rows() == 1) { $id = mysql_insert_id(); }
else { // select ... 
}
?>

Ben sizin aradığınız ne excatly değil biliyorum ama ben ile gelebilir en iyisi

Güncellenmesi olduğunda herhangi bir alanın değerini almak için mysql_insert_id () ve ON YİNELENEN KEY UPDATE, alternatif harika bir şekilde kullanarak rağmen bulunamadı başka here:

UPDATE table SET id=(@tempid:=id) , .... LIMIT 1;
SELECT @tempid;

Ben (id, statü) 'id' Birincil dizin otomatik artış ile tabloya sahip kullanılan ve 'status' güncelleme yapıldığı üzerine bir alan oldu, ama güncellenen satırın 'id' almak gerekiyordu. Mysql_insert_id () olarak yarış koşullarına da dayanıklı bu çözüm.