0

私は2つのテーブルを持っています:

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)
)

この行が2番目のテーブルに存在しない場合、最初のテーブルの行を2番目のテーブルに挿入する関数を作成したいと思います。比較テーブルのフィールドは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'

ただし、テーブルfiledataには何も挿入されません。

関数呼び出し

  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パーツは違いを確認するための 1 つの方法にすぎません。テーブルに参加することは別です。どちらが最適かは、実際のデータによって異なります。

その他 注: 両方の表に がありnum serialます。しかし、あるテーブルから別のテーブルにデータを押し込むことは、両方SERIALのテーブルが互いに戦っていることを意味します。2番目の表でそれをプレーンintにする必要があります。

于 2012-08-06T08:55:58.313 に答える
0

マニュアルで最も関連性の高いセクションは39.9 です。トリガー手順。そこにある例、特に 例 39-4。監査のための PL/pgSQL トリガー プロシージャは、現在のコードよりも優れた出発点になる可能性があります。

于 2012-08-06T08:18:47.223 に答える