Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何合并到数据库中_Php_Mysql_Database_Collections - Fatal编程技术网

Php 如何合并到数据库中

Php 如何合并到数据库中,php,mysql,database,collections,Php,Mysql,Database,Collections,我很难找到解决这个问题的最佳方法 我有两个不同的项目列表, 一个在数据库中,一个不在数据库中。两份名单都有 项目ID和数量,我需要合并 将这两个列表输入数据库 我的第一个倾向是从数据库中取出所有项,然后在应用程序逻辑中合并这两个列表。然后,我将从数据库中删除旧列表,并插入新的合并列表 我想我也可以为我想合并到数据库中的每个项目更新/插入,但是这意味着要进行很多查询(也许我可以编写一个存储过程,但我对存储过程不太感兴趣) 我想知道SQL或应用程序逻辑在这种情况下是否会表现得更好 我也想听听其他人如

我很难找到解决这个问题的最佳方法

我有两个不同的项目列表, 一个在数据库中,一个不在数据库中。两份名单都有 项目ID和数量,我需要合并 将这两个列表输入数据库

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

我想我也可以为我想合并到数据库中的每个项目更新/插入,但是这意味着要进行很多查询(也许我可以编写一个存储过程,但我对存储过程不太感兴趣)

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

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

谢谢

更新:

这里有更多的细节

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

还有一个更新:


使用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