我有一张如下表格:
point_path_id line_path_id season_id gps_time heading roll pitch geometry
1 ___ ___ ___ ___ ___ ___ PostGISGeom
2 ___ ___ ___ ___ ___ ___ PostGISGeom
3 ___ ___ ___ ___ ___ ___ PostGISGeom
4 ___ ___ ___ ___ ___ ___ PostGISGeom
5 ___ ___ ___ ___ ___ ___ PostGISGeom
我在PHP中也有我要更新的ID列表以及line_path_id和season_id的值。我也有gps_time,heading,roll,pitch的数组。
我有以下SQL语句(来自PHP的回声)
UPDATE greenland.point_paths
SET
line_path_id=1,
season_id=2,
gps_time=unnest(array[1303475178.0031,1303475178.0081,1303475179.0081,1303475180.0081,1303475181.0081]::double precision[]),
heading=unnest(array[-2.0819464,-2.0819407,-2.0820324,-2.08202,-2.0819855]::double precision[]),
roll=unnest(array[-0.007395,-0.007395,-0.0073832,-0.0073949,-0.0073853]::double precision[]),
pitch=unnest(array[-0.0246114,-0.0246115,-0.0246108,-0.024582,-0.0245905]::double precision[])
WHERE point_path_id IN (1,2,3,4,5);
这是插入,但不正确。在point_path_id中为所有5个id插入数组的第一个值。我在表格中得到以下内容:
这种取消在许多其他语句中都能正常工作,但我似乎无法让它在这种形式下正常工作。我的错误在哪里?
这是在此之前发生的一些背景: JSON数据字符串通过URLEAD(MATLAB)发送,并通过PHP解码/插入到许多表中。
插入PostGIS线串GEOM并返回其ID(line_path_id) 插入季节并返回其ID(season_id)
然后将线串转储到上述表中的点,并自动生成并返回串行point_path_id。
然后需要插入与每个点相关的数据(这就是我想要做的)
我有每个点的line_path_id,season_id,gps_time / heading / roll / pitch。时间/航向/横滚/俯仰是阵列中点数的长度。
可能有100,000多个积分,但让我们测试5。
转储积分后,会再次显示一张表格:
point_path_id line_path_id season_id gps_time heading roll pitch geometry
1 ___ ___ ___ ___ ___ ___ PostGISGeom
2 ___ ___ ___ ___ ___ ___ PostGISGeom
3 ___ ___ ___ ___ ___ ___ PostGISGeom
4 ___ ___ ___ ___ ___ ___ PostGISGeom
5 ___ ___ ___ ___ ___ ___ PostGISGeom
我还有两个变量: $ line_path_id =# $ season_id =#
4个阵列 $ gps_time = [#,#,#,#,#]; 标题... 滚... 螺距...
我需要为每个点几何体插入关联的值。这是目标。
希望这有助于找到最佳解决方案。
答案 0 :(得分:1)
unnest()是一个集合返回函数。您的问题是UPDATE语句中的每个SET赋值都在寻找一个值来分配给WHERE子句找到的每一行的字段。 UPDATE不知道您打算将第一个数组值转到point_path_id = 1的行,依此类推。
对于小型数组,您可以将查询重写为:
UPDATE greenland.point_paths
SET line_path_id=1,
season_id=2,
gps_time=(array[1303475178.0031,1303475178.0081,1303475179.0081,1303475180.0081,1303475181.0081])[point_path_id]::double precision[],
heading=(array[-2.0819464,-2.0819407,-2.0820324,-2.08202,-2.0819855])[point_path_id]::double precision[],
roll=(array[-0.007395,-0.007395,-0.0073832,-0.0073949,-0.0073853])[point_path_id]::double precision[],
pitch=(array[-0.0246114,-0.0246115,-0.0246108,-0.024582,-0.0245905])[point_path_id]::double precision[]
WHERE point_path_id IN (1,2,3,4,5);
虽然这依赖于匹配数组索引的point_path_id。
您可能需要采用不同的方法将此数据导入系统。如果您希望在此表中一次更新100,000行,则可能应该使用COPY将数据批量上载到具有point_path_id,season_id,line_path,gps_time,roll,pitch,heading each的staging表中每行单值。然后你可以这样做:
UPDATE greenland.points_path pp
SET season_id=s.season_id,
line_path=s.line_path,
gps_time=s.gps_time,
roll=s.roll,
pitch=s.pitch,
heading=s.heading
FROM staging s
WHERE pp.point_path_id=s.point_path_id