将要素从一个PostGIS层复制到另一层时,如何避免重复的GID?


11

当我在另一个Postgres图层中输入新元素(功能)时,可以通过两种方式进行操作:

  1. 绘制新元素(带有“添加功能”),我很少这样做或
  2. 复制(或剪切)另一个Postgre层(Source层)中的某些元素,并将其粘贴到我经常执行的目标层中

在第一个示例中,保存编辑工作正常,因为此层从postgre数据库序列获取gid * nextval('layer_name_gid_seq':: regclass)*

在第二个示例中,在保存编辑时出现错误,因为在将元素从源层复制到目标层时,qgis 从源层复制 了元素的gid。尝试保存编辑内容时,将返回以下错误:

无法提交对“ Cjevovodi”层的更改。
错误:错误:未添加1个功能。
提供程序错误:
添加功能时出现PostGIS错误:错误:重复的键值违反了唯一约束“ cjevovodi_okill_pkey”
详细信息:键(gid)=(5)已存在。

我试图在字段gid中复制* nextval('layer_name_gid_seq':: regclass)*,但是由于字段被定义为数字,因此无法将该序列粘贴到字段gid中。

有谁知道从源层复制元素的简单方法(使用现有的gid)分配新的gid?

谢谢!


您正在使用哪个版本的qgis和平台?我在Windows 7中使用QGIS 2.0,并且在postigs层之间的复制粘贴中似乎没有问题。
亚历山大·内图

您是否找到解决此问题的方法?我遇到了完全相同的问题。我不想在PostgreSQL中放置触发器的问题,这是QGIS在通过复制其他功能创建新功能时不提取默认值的问题。
获得空间

Answers:


4

我无法在QGIS 2.2 Windows c3a2817中重现此内容。

如果其他版本的行为有所不同,或者您继续遇到此问题,则可以在表上设置PostgreSQL触发器作为解决方法:

使用此示例表:

CREATE TABLE testing (gid serial PRIMARY KEY, geom geometry(Polygon, 4326));

这是一个触发函数,它将gid在需要的地方分配一个新的:

CREATE OR REPLACE FUNCTION testing_insert_trigger()
RETURNS trigger AS
$$
BEGIN
IF EXISTS (SELECT 1 FROM testing WHERE gid = NEW.gid) THEN
    NEW.gid := nextval('testing_gid_seq'::regclass);
END IF;
RETURN NEW;
END;
$$ language 'plpgsql';

将函数绑定到表...

CREATE TRIGGER testing_insert 
BEFORE INSERT ON testing
FOR EACH ROW EXECUTE PROCEDURE testing_insert_trigger();

这将在gid已经存在的地方自动分配新的ID 。例如,下面的查询现在将复制表中的所有数据,而不是失败:

INSERT INTO testing (SELECT * FROM testing);

当然,这种方法可能会损害主键的意图,因此请谨慎使用。


0

从源图层中选择要素,然后将选择的内容(将所选内容另存为...)保存在shapefile中。在QGIS项目中添加保存的shapefile并打开属性表,然后删除字段“ gid”并保存shapefile。在shapefile中选择要素,然后将其复制到您的工作层中。


感谢您的回答,但我正在尝试找到一种更简单的方法。
2013年

1
如果您有gid serial,int i之类的表,则只需插入i即可自动获得gid。我有一些遥远的记忆,可能在QGIS中,但我不记得要怎么做
simplexio 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.