在UPDATE / SET语句中删除PostgreSQL / PHP

时间:2013-02-18 20:52:08

标签: php arrays postgresql updates

我有一张如下表格:

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插入数组的第一个值。我在表格中得到以下内容:

enter image description here

这种取消在许多其他语句中都能正常工作,但我似乎无法让它在这种形式下正常工作。我的错误在哪里?

这是在此之前发生的一些背景: 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 = [#,#,#,#,#]; 标题... 滚... 螺距...

我需要为每个点几何体插入关联的值。这是目标。

希望这有助于找到最佳解决方案。

1 个答案:

答案 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