我有两张桌子:
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();
答案 0 :(得分: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
。但是将数据从一个表推送到另一个表中意味着两个SERIAL
正相互争斗。你应该在第二个表中使它成为普通的int
。
答案 1 :(得分:0)
手册中最相关的部分是39.9. Trigger Procedures。那里的例子,特别是例39-4。用于审计的PL / pgSQL触发程序可以是比当前代码更好的起点。