gpt4 book ai didi

postgresql - Postgresql/postgis 中的触发器

转载 作者:行者123 更新时间:2023-11-29 12:25:25 25 4
gpt4 key购买 nike

我将一个 shapefile 加载到 postgis 数据库中。此 shapefile 经常由源更新,因此我当前的过程是:

  1. 使用带有 -a 选项的 shp2pgql 生成插入语句。
  2. 运行第 1 步中生成的 SQL 以附加到数据库。

当然,我最终得到了两个版本的 shapefile 中的所有行,我需要的是删除所有以前的行并仅加载更新后的 shapefile 中的行。

我尝试在数据库中创建触发器和触发器函数:

    CREATE TRIGGER drop_all_rows_from_owner_table_trigger
BEFORE INSERT
ON owner_polygons_common_ownership_layer
FOR EACH STATEMENT
EXECUTE PROCEDURE drop_all_rows_from_owner_table();

这是触发函数:

CREATE OR REPLACE FUNCTION drop_all_rows_from_owner_table() 
RETURNS trigger AS $$
BEGIN DELETE FROM owner_polygons_common_ownership_layer;
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';

我相信我所做的只是从表中删除所有行,插入新行,然后再次删除它们,因为当我在流程结束后查看表时,我有零行。我使用了 FOR EACH STATEMENT 子句,因为 shp2sql 创建了一个 INSERT 语句。

我的问题是:触发器是完成此任务的方法吗?

最佳答案

你的触发函数似乎是正确的。

但是,我认为这不是要走的路:您不能确定 shp2pgsql 会生成单个语句。如果您的 shapefile 增长,它可能会将您的插入拆分为多个语句。

因此,如果您不能使用 -d 选项(删除并重新创建表),我会在流程 1 和 2 之间添加一个步骤来截断表。

您还可以在生成的 sql 文件中预先添加 truncate 语句,或者您可以执行另一个 psql 命令来截断表。

关于postgresql - Postgresql/postgis 中的触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41580659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com