Howto bir veritabanına birleştirme

4 Cevap php

Ben sorun bu sorunu yaklaşım en iyi yolu bulmaktan yaşıyorum,

I have two different list of items, one in the DB, one not. Both list have item ids and quantity, I need to merge the two list into the DB.

Benim ilk eğim sadece o uygulama mantığı iki listeyi birleştirme DB dışında tüm öğeleri çekmek. Daha sonra DB eski listesini silmek ve yeni birleştirilmiş listesini eklemek istiyorum.

Ayrıca ben, DB içine birleştirmek için ancak bu sayıda sorgu anlamına geleceğini istediğiniz öğelerin her biri için / ekler güncelleme olabilir anlamaya (belki yazabilirim bir saklı prosedür var, ama saklanan prosedürleri ile bu sıcak değilim).

SQL veya uygulama mantığı bu durumda daha iyi yapacak varsa bilmek istiyorum?

Ben de başkalarının bu sorunu çözmek nasıl duymak istiyorum.

teşekkürler.

GÜNCELLEME:

İşte bazı ayrıntılar vardır

Bu tek seferlik bir birleştirme değil, birkaç kez olacak. Temelde ben sonunda bu öğeleri veritabanına koymak gerekir, öğelerin bir listesini tutan benim uygulamada bir nesne var. Orada DB öğeler zaten, bu yüzden sadece öğeleri eklemek değil, ben iki öğe aynı id varsa DB bir iş kaleminin miktarı artırmak ve benzersiz kimlikleri ile öğeler eklemek gerekir.

ONE MORE GÜNCELLEME:

MySQL ve PHP kullanarak

4 Cevap

Iki geçici tablolar oluşturma, bir anda DB ne değildir içeren eski DB verilerin bir kopyasını ve diğer olmak. Sonra iki tablo üzerinde çanta sendika karşı bir gruplama sorgusu yapmak.

Örneğin, aşağıdaki başlatma noktası verilir ve MySQL sözdizimi varsayarak:

create temporary table a (name varchar(255), quantity int);
create temporary table b (name varchar(255), quantity int);
insert into a values ('fork', 1), ('spoon', 2);
insert into b values ('fork', 2), ('knife', 1);

Daha sonra sadece arzu sonuç almak için aşağıdaki sorguyu çalıştırabilir.

select name, sum(quantity) AS quantity 
  from ((select * from a) union all (select * from b)) c
  group by c.name;

Eğer sonuç verecek olan:

 +-------+----------+
 | name  | quantity |
 +-------+----------+
 | fork  |        3 | 
 | knife |        1 | 
 | spoon |        2 | 
 +-------+----------+

Geri orijinal veri tabloya sonucu saklamak istedim, sadece iki geçici tablolar oluşturduktan sonra özgün tablodan silin ve sonra SELECT original_table INSERT INTO ile tüm SELECT deyimini Önlerine ...

Daha fazla detay kullandığınız veritabanı platformu olmak üzere, yararlı olacaktır.

Belki sizin Barnes & gibi veritabanında sahip bir ürün kataloğu ve birleştirmek için çalışıyoruz veritabanı dışında bazı benzer kümesi gibi bir şey olabilir gibi bir arada ... Bu sesler Bumpster Noble mağaza, Nebraska katlanmış ve ana depoya kendi envanterini yeniden entegre ediyoruz.

"Ürün" kimlikleri iki sistemlerde aynı iseniz, belki, dış toplulukta yineleme her sayısını, ve sonra ana ürün tabloda bazı toplam artırmak istiyorum bir saklı yordam bir döngü yapısı oluşturabilir.

Sen hangi programlama dili ya da sizinle ilgilenen veritabanı söz etmedi, ama ben seçtiğiniz veritabanı için bir "UPSERT" komutunun durumu içine bakmak istiyorum.

Oracle için, bu INTO deyimini birleştirme olacaktır: http://www.psoug.org/reference/merge.html Ben SQLSunucusu bir "BULUNMASI HALİNDE" deyimi ya da böyle bir şey (üzgünüm, sık sık SQLSunucusu dont kullanımı) olduğunu düşünüyorum.

Temelde bir "Upsert" bir, "eklemek veya güncelleştirmek", bunun yerine belirli bir kimliği zaten var olup olmadığını satır karar vermek zorunda, sadece bu kimliği yoksa "Burada, benim veri olduğunu söyleyebiliriz saplamasıdır o zaten yoksa o, o zaman güncelleyin. "

Mysql kullanımı

INSERT INTO TABLE1 (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c = c+3

Eğer farklı bir veritabanı kullanıyorsanız sözdizimini değiştirmek zorunda kalacak.

Eğer geçici bir tablo yaklaşımı kullanırsanız orada ana tabloyu silmek gerek yoktur, ve büyük olasılıkla çok kötü olurdu.

CREATE TEMPORARY TABLE temp1 .....identical to main table
INSERT everything into temp1

INSERT (colnames ...) INTO main1 SELECT (colnames ..) FROM temp1 
    ON DUPLICATE KEY UPDATE onhand = main1.onhand + temp1.onhand