Php 如何合并到数据库中
我很难找到解决这个问题的最佳方法 我有两个不同的项目列表, 一个在数据库中,一个不在数据库中。两份名单都有 项目ID和数量,我需要合并 将这两个列表输入数据库 我的第一个倾向是从数据库中取出所有项,然后在应用程序逻辑中合并这两个列表。然后,我将从数据库中删除旧列表,并插入新的合并列表 我想我也可以为我想合并到数据库中的每个项目更新/插入,但是这意味着要进行很多查询(也许我可以编写一个存储过程,但我对存储过程不太感兴趣) 我想知道SQL或应用程序逻辑在这种情况下是否会表现得更好 我也想听听其他人如何解决这个问题 谢谢 更新: 这里有更多的细节 这不是一次合并,它将发生多次。基本上,我的应用程序中有一个对象,其中包含一个项目列表,最终需要将这些项目放入数据库中。数据库中已经有项,因此我不能只插入项,如果两个项具有相同的id,我必须增加数据库中的项数量,并插入具有唯一id的项 还有一个更新:Php 如何合并到数据库中,php,mysql,database,collections,Php,Mysql,Database,Collections,我很难找到解决这个问题的最佳方法 我有两个不同的项目列表, 一个在数据库中,一个不在数据库中。两份名单都有 项目ID和数量,我需要合并 将这两个列表输入数据库 我的第一个倾向是从数据库中取出所有项,然后在应用程序逻辑中合并这两个列表。然后,我将从数据库中删除旧列表,并插入新的合并列表 我想我也可以为我想合并到数据库中的每个项目更新/插入,但是这意味着要进行很多查询(也许我可以编写一个存储过程,但我对存储过程不太感兴趣) 我想知道SQL或应用程序逻辑在这种情况下是否会表现得更好 我也想听听其他人如
使用MySQL和PHP更多详细信息会有所帮助,包括您正在使用的数据库平台 同时。。。这听起来像是数据库中的产品目录,以及数据库外的一些类似的数据集,您正试图合并到其中,比如您在内布拉斯加州邦普斯特的巴诺百货商店已经倒闭,您正在将其库存重新整合到主店中
如果两个系统中的“产品”ID相同,您可以在存储的过程中创建一个循环结构,该结构将遍历外部集合,计算每个集合的数量,然后在主产品表中增加一些总数。更多详细信息会有所帮助,包括您正在使用的数据库平台 同时。。。这听起来像是数据库中的产品目录,以及数据库外的一些类似的数据集,您正试图合并到其中,比如您在内布拉斯加州邦普斯特的巴诺百货商店已经倒闭,您正在将其库存重新整合到主店中
如果两个系统中的“产品”ID相同,您可以在存储过程中创建一个循环结构,该结构将遍历外部集合,计算每个集合的数量,然后在主产品表中增加一些总数。创建两个临时表,一个是旧数据库数据的副本,另一个包含当前数据库中没有的数据。然后对两个表上的行李联合进行分组查询 例如,给定以下初始化点,并假设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语句前面加上INSERT into original_table SELECT…Create TWORE temp tables,一个是旧数据库数据的副本,另一个包含当前数据库中没有的数据。然后对两个表上的行李联合进行分组查询 例如,给定以下初始化点,并假设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语句前面加上INSERT into original_table SELECT…您没有提到要处理的编程语言或数据库,但我会研究为您选择的数据库提供“UPSERT”命令的可用性 对于Oracle,这将是MERGE-INTO语句:我认为SQLServer有一个“IF-find”语句或类似的语句(对不起,我不经常使用SQLServer)
基本上,“upsert”是一个“insert或update”,因此不必决定具有给定ID的行是否已经存在,您只需说“这是我的数据,如果这个ID不存在,请插入它,如果它已经存在,然后更新它。”您没有提到您正在处理的编程语言或数据库,但我会研究为您选择的数据库提供“UPSERT”命令的可用性 对于Oracle,这将是MERGE-INTO语句:我认为SQLServer有一个“IF-find”语句或类似的语句(对不起,我不经常使用SQLServer) 基本上,“upsert”是一个“insert或update”,因此不必决定具有给定ID的行是否已经存在,您只需说“这是我的数据,如果这个ID不存在,请插入它,如果它已经存在,然后更新它。”在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
在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