Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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
在PostgreSQL中是否有一种方法可以以不同的方式一次更新/修改多行?_Sql_Postgresql_Query Performance - Fatal编程技术网

在PostgreSQL中是否有一种方法可以以不同的方式一次更新/修改多行?

在PostgreSQL中是否有一种方法可以以不同的方式一次更新/修改多行?,sql,postgresql,query-performance,Sql,Postgresql,Query Performance,我在PostgreSQL中有两个表,每天都会收到带有新信息的CSV。作为参考,这是一个健身房,所以每个人都有ID、地址、会员资格何时终止等等 所以我有一个包含所有这些元数据的表成员身份。每次输入CSV时,我都希望添加新成员行,并更改现有成员的任何更改的元数据 同时,我希望将所有这些更改记录在一个单独的“操作”表中 所以说我有 John, 33, 1234 A St, Anchorage, AK, 555-555-5555 这会进入我的主“成员资格”表,也会作为“新”进入“操作”表 如果第二天

我在PostgreSQL中有两个表,每天都会收到带有新信息的CSV。作为参考,这是一个健身房,所以每个人都有ID、地址、会员资格何时终止等等

所以我有一个包含所有这些元数据的表成员身份。每次输入CSV时,我都希望添加新成员行,并更改现有成员的任何更改的元数据

同时,我希望将所有这些更改记录在一个单独的“操作”表中

所以说我有

John, 33, 1234 A St, Anchorage, AK, 555-555-5555 
这会进入我的主“成员资格”表,也会作为“新”进入“操作”表

如果第二天由于某种原因,
John
发送了地址变更通知,则
会员资格
表将更新为

John, 33, 6789 B St, Anchorage, AK, 555-555-5555
不创建新行。在actions表中创建了一个新行,它有John的
成员ID
(串行PK)和空值,地址值除外,现在显示为
6789 B St
,并且action
已更新

我想知道,如果信息都同时进来,是否有办法分批完成(比如说,我有10个成员,他们都需要以不同的方式更新元数据,一个更改了电话号码,另一个更改了地址)。我知道我可以一个接一个地完成所有这些,但这似乎很昂贵,所以我想知道是否有一种方法可以在更少的查询中完成

如果我有300行修改,我可以一次完成所有操作,还是必须一次完成一行

谷歌搜索似乎有一些关于
WHILE
IF
的问题,但我也只是想知道我在这方面是否走对了,因为我找不到解决这个问题的方法。似乎可以进行批量插入和删除(如果所有插入和删除都是新的,或者所有插入和删除都是新的),但我不知道是否进行了不同的修改(可能有些是新的,有些需要修改,有些需要删除)


感谢您的帮助

在SQL中,如果要同时执行多个操作,最快的方法是连接并选择NOT while。循环在SQL中是不好的

由于需要在SQL中执行联接,因此需要在表中使用数据。通常,这是通过“暂存表”完成的。这些是放置新数据的表,然后可以在将其放入系统时将其连接起来

例如,在您的情况下,300个staging member信息将被放置在stage_memeber表中,然后您可以通过加入该表来运行对主表的更新。这将是一个查询和更新语句

然后,您可以离开join来查找不存在的项,并将其提供给insert语句——同样是一个查询

有时,您可能希望将暂存数据放入一个归档文件中,并保存到一个审核表中,以便了解您过去所做的工作。或者,在为下一次加载清除数据之前,您可以根据暂存表中的内容汇总数据并将其写入审计系统


通过在流行搜索网站上搜索ETL(用于提取转换加载)或“从暂存表加载数据”,您应该能够找到有关该领域领先实践的更多信息。

您正在寻找As,因为“更新除非是新成员,然后插入”称为
Upsert
操作。Postgres使用冲突DO UPDATE上的
执行此操作。您可以阅读他们手册的第页。您如何知道此John与您表格中的John相同?Jeremy-在本例中,John只是我用来保护无法共享的信息的随机数据。我试图解决这个问题的项目,John将被一个唯一的索引号取代,所以我不担心John是同一个或不同的John,非常感谢!我来看看这个。