如何合并到数据库中

时间:2009-07-28 18:26:32

标签: php mysql database collections

我无法找出解决此问题的最佳方法,

  

我有两个不同的项目列表,   一个在DB中,一个不在。这两个清单都有   项目ID和数量,我需要合并   将两个列表放入DB。

我的第一个倾向是将所有项目从数据库中拉出,然后在应用程序逻辑中合并两个列表。然后,我将从数据库中删除旧列表并插入新的合并列表。

我想我也可以为我要合并到数据库中的每个项目更新/插入,但这意味着许多查询(可能有一个我可以编写的存储过程,但我对存储过程并不热)。

我想知道SQL或应用程序逻辑在这种情况下是否会表现更好?

我还想听听其他人如何解决这个问题。

感谢。

更新:

以下是一些更多细节,

这不是一次性合并,它会发生几次。基本上我在我的应用程序中有一个包含项目列表的对象,最终这些项目需要放入数据库中。数据库中已有项目,因此我不能只插入项目,如果两个项目具有相同的ID,则必须增加数据库中项目的数量,并插入具有唯一ID的项目。

更多更新:

使用MySQL和PHP

4 个答案:

答案 0 :(得分:1)

创建两个临时表,一个是旧DB数据的副本,另一个包含当前不在DB中的内容。然后对两个表上的bag union进行分组查询。

例如,给定以下初始化点,并假设MySQL语法:

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);

然后,您只需运行以下查询即可获得所需的结果。

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

哪会给你结果:

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

如果要将结果存储回原始数据表,只需在创建两个临时表后从原始表中删除,然后使用INSERT INTO original_table SELECT ...

添加整个SELECT语句。

答案 1 :(得分:0)

更多细节会有所帮助,包括您正在使用的数据库平台。

与此同时......听起来它可能类似于数据库中的产品目录,以及您尝试合并的数据库外部的一些类似数据集,例如您的Barnes&在内布拉斯加州Bumpster的贵族商店折叠起来,您将他们的库存重新整合到您的主要商店。

如果两个系统中的“产品”ID相同,您可以在存储过程中创建一个循环结构,该循环结构将遍历外部集合,计算每个集合的数量,然后在主要产品中增加一些总计表

答案 2 :(得分:0)

您没有提及您正在处理的编程语言或数据库,但我会查看所选数据库的“ UPSERT ”命令的可用性。

对于Oracle,这将是MERGE INTO语句:http://www.psoug.org/reference/merge.html我认为SQLServer有一个“IF FOUND”语句或类似的东西(我经常不使用SQLServer,抱歉)。

基本上“upsert”是“插入或更新”,因此不必确定具有给定ID的行是否已存在,您只需说“这是我的数据,如果此ID不存在存在,插入它,如果它已经存在,则更新它。“

答案 3 :(得分:0)

在mysql中使用

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

如果使用其他数据库,则必须更改语法。

如果使用临时表方法,则无需删除主表,这可能非常糟糕。

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