2016-04-07 23 views
1

Günlük mysql değerlerini ekleyen (veya güncelleştiren) bir uygulama oluşturuyorum. başlıklarıyla basitleştirilmiş kayıt kümesi ise:mysql benzersiz dizin sütun kümesinden

ItemName,ItemNumber,ItemQty,Date 
test1,1,5,2016/01/01 
test1,1,3,2016/01/02 
test2,2,7,2016/01/01 
test2,2,5,2016/01/02 

16 sütun ve 216,000 kayıtları ile yukarıdaki kayıt için basit bir ekleme deyimini kullanarak yaklaşık 4 dakika (php/mysql) alır - Bu kapsar değerlerin bir hafta. Tabii ki aynı kayıt kümesini ithal edersem, kopyalarım olurum. Yinelenen girişleri etkin bir şekilde engellemenin bir yolunu bulmaya çalışıyorum. Amaç: Her gün aldığım senaryoda, geçerli haftanın tarihleri ​​olan bir kayıt kümesi, yalnızca yeni tarihlerin eklenmesiyle sonuçlanır.

Ardıl içe aktarmalarda değişebilecek tek şey, ItemQty'dir. PHP'de ItemName, ItemNumber, Date için db'yi eklemeye çalıştığım değerlerle sorguladığım bir mantık yaptım. SELECT ifadesinde bir sonuç varsa, ben kırırım. Yoksa, yeni bir satır eklemeye devam ediyorum. Sorun şu ki, bu mantığın eklenmesiyle artık 4 dakika değil, birkaç saat sürüyor. (Çalışıyor)

Herhangi bir fikrin var mı?

Belki de eklerken, sağlama toplamı gibi bir şey eklemek için md5 (ItemName, ItemNumber, ItemQty, Date) eklemek ve sonra bu sağlama toplamı yerine SELECT * kontrol edin $ tablo WHERE ItemName = value, ItemNumber = değer, ItemQty = değer, şu anda sahip olduğum Date = date.

Sorunum, eklediğim kayıtların temel olarak benzersiz hiçbir şeye sahip olmamasıdır. Teklik, bir grup alandan, yalnızca içe aktarılacak veri kümesine kıyasla gelir. Bir şekilde benzersizliği yakalarsam, diğer sorunumu da çözerim ki bu da bir satır siliyor ya da ItemQty değiştiğinde bir satırı güncelliyor.

cevap

1

Aradığın, unique constraint. benzersiz kısıtlama kullanarak, kısıtlama için tüm sütunları ekleyebilir ve tüm sütunlar ekleme verileri uygun bulursa o

1

Birkaç seçenekleri ekleme de devam etmeyecektir: mapping, PHP üzerinde

1) kayıtları üzerinde yineleme yinelenen olanlar ve tutmak newests

$itemsArray = []; // The array where you have stored your data 

$uniqueItems = []; 

foreach($itemsArray as $item) 
{ 
    if(isset($uniqueItems[$item['ItemName']])) 
    { 
     $oldRecord = $uniqueItems[$item['ItemName']]; 

     $newTimeStamp = strtotime($item['Date']); // Might not work with your format date 
     $currentTimeStamp = strtotiem($oldRecord['Date']); 

     if($newTimeStamp > $currentTimeStamp) 
     { 
      $uniqueItems[$item['ItemName']] = $item; 
     } 
    } 
    else 
    { 
     $uniqueItems[$item['ItemName']] = $item; 
    } 
} 

// uniqueItems now hold only 1 record per ItemName (the newest one) 
)() veritabanında takmadan önce küçükten büyüğe üzerinde tarihe göre php verileri sıralayın. Ardından, kendi cümleciğine göre ON DUPLICATE KEY UPDATE'u kullanın. Bu mysql kayıtları yinelenen anahtar ile güncelleştirmek neden olur. Bu durumda, önce eski kayıtlar eklenecektir, bu yüzden en eski kayıtlar eski kayıt verilerinin üzerine yazılarak sonuncuya eklenecektir.

+0

DUPLICATE TUŞUNU kullanabilmek için tabloda benzersiz bir anahtara ihtiyacı vardır. – Barmar

+0

Evet, ItemName ... – Nadir

+0

Bence benzersiz anahtar '(itemName, itemNumber, date)' – Barmar

İlgili konular