【问题标题】:PostgreSQL - How can I ensure that an ID is not present in other tables?PostgreSQL - 如何确保 ID 不存在于其他表中?
【发布时间】:2016-07-18 14:18:53
【问题描述】:

我在 postgreSQL 中有四个表如下:

Table A            Table A_POINTS  Table A_LINES  TABLE A_POLYGONS
----------------- ---------------- -------------- ----------------
id / colum1 / ...  id/  the_geom   id / the_geom  id/ the_geom

我想确保表 A 中的一个元素仅存在于一个几何表中。

我可以通过在几何表中设置 id UNIQUE 约束来做到这一点吗? 在这种情况下,我该如何在 postgreSQL 中做到这一点?

编辑

是的,我想要的是三个表的某种唯一约束。表 A 与点、线或多边形相关,但同时只有一个。

Table A            Table A_POINTS  Table A_LINES  TABLE A_POLYGONS
----------------- ---------------- -------------- ----------------
id / colum1 / ...  id/  the_geom   id / the_geom  id/ the_geom
 1   blabla         1  09838082..  3    082982..  2    092809...
 2   bleble
 3   blibli

那么有可能吗?

【问题讨论】:

  • 你有哪三个几何表(定义完全相同)?
  • 因为我将这些表连接到 Geoserver,如果我在同一个表中有所有几何图形并且我不限制它的几何类型,Geoserver 将无法在同一个“层”中呈现不同的几何图形。我可以将所有内容都放在同一个表中,但稍后在 Geoserver 中我必须执行 SQL 视图以按几何图形分隔它。
  • 视图确实是避免重复 id 的方法。但我认为您也希望对三种几何类型进行列级约束。
  • 查看我的编辑。我可以通过使用一些服务器端代码和对数据库的查询来控制它。但我认为如果这可能的话,这可能是一个更优雅的解决方案。感谢您的回复。
  • 您可能正在寻找表继承:postgresql.org/docs/current/static/ddl-inherit.html.

标签: sql postgresql constraints postgis data-modeling


【解决方案1】:

我最终通过在插入每个几何表之前触发一个函数来获得结果,以确保我要插入的标识符不存在于其他几何表中。

编辑

功能

CREATE OR REPLACE FUNCTION trg_check_denuncias_lineas_otra_tabla()
  RETURNS trigger AS
$BODY$
BEGIN
   IF EXISTS(SELECT * FROM denuncias_puntos WHERE gid = NEW.gid)
   OR 
   EXISTS(SELECT * FROM denuncias_poligonos WHERE gid = NEW.gid)
   THEN
    RAISE EXCEPTION 'Report geometry should be only in one table of geometries';
   END IF;
   RETURN NEW;
END
$BODY$
  LANGUAGE plpgsql VOLATILE

触发

CREATE TRIGGER lineas_check_otra_tabla
  BEFORE INSERT
  ON denuncias_lineas
  FOR EACH ROW
  EXECUTE PROCEDURE trg_check_denuncias_lineas_otra_tabla();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    相关资源
    最近更新 更多