0

我有两张桌子:

CREATE TABLE filedata_temp
(
 num serial NOT NULL,
 id integer,
 mydata character(25),
 the_geom geometry,
 CONSTRAINT filedata_pkey PRIMARY KEY (num)
)


CREATE TABLE filedata
(
 num serial NOT NULL,
 id integer,
 mydata character(25),
 the_geom geometry,
 CONSTRAINT filedata_temp_pkey PRIMARY KEY (num)
)

如果第二个表中不存在此行,我想创建从第一个表中插入行到第二个表中的函数。比较表的字段是num字段。

阅读一些示例后:

  CREATE OR REPLACE FUNCTION  insert_into_wgs()
  RETURNS void AS
  $BODY$
  BEGIN
insert into filedata 
(
    id,
    mydata,
    the_geom,

)
values
(
    id,
    mydata,
    ST_TRANSFORM(the_geom,4326)
);
 end
 $BODY$
 LANGUAGE 'plpgsql'

所以我需要一些帮助/

更新

我试试这个功能(数据库之神告诉我)

CREATE OR REPLACE FUNCTION  insert_into_wgs()
RETURNS void AS
$$
BEGIN
 INSERT INTO filedata (id,mydata,the_geom)  
 SELECT id,mydata,ST_TRANSFORM(the_geom,4326)
 FROM filedata_temp
 WHERE id NOT IN (SELECT id FROM filedata);
end;
$$
LANGUAGE 'plpgsql'

但是没有插入表文件数据。

函数调用

  ce_proc = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgis","postgres","123456");
  CallableStatement proc = (CallableStatement) ce_proc.prepareCall("{call insert_into_wgs()}");
  proc.execute();
4

2 回答 2

1

您可以使用INSERT ... SELECT语法将数据从一个表推送到另一个表中:

INSERT INTO filedata (...) SELECT ... FROM filedata_temp WHERE NOT EXISTS 
(
    SELECT 1 FROM filedata WHERE filedata.num = filedata_temp.num
)

当然,WHERE NOT EXISTS零件只是检查差异的一种方法。加入餐桌是另一回事。哪个是最好的取决于您的实际数据。

其他说明:两张表都有num serial。但是将数据从一个表推到另一个表中,这意味着两个SERIALs 都在互相争斗。int您应该在第二张表中明确说明。

于 2012-08-06T08:55:58.313 回答
0

手册中最相关的部分是39.9。触发程序。那里的示例,尤其是 示例 39-4。用于审计的 PL/pgSQL 触发器过程可能是比当前代码更好的起点。

于 2012-08-06T08:18:47.223 回答