PostgreSQL - 如何确保其他表中不存在ID?

时间:2016-03-30 14:03:38

标签: sql postgresql constraints postgis data-modeling

我在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

所以可以这样做吗?

1 个答案:

答案 0 :(得分:2)

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

修改

功能

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

TRIGGER

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