PostgreSQL - 如何确保 ID 不存在于其他表中?
PostgreSQL - How can I ensure that an ID is not present in other tables?
我在 postgreSQL 中有四个 tables 如下:
Table A Table A_POINTS Table A_LINES TABLE A_POLYGONS
----------------- ---------------- -------------- ----------------
id / colum1 / ... id/ the_geom id / the_geom id/ the_geom
我想确保 table A 中的一个元素只存在于一个几何体 table 中。
我可以通过在几何 table 中设置 id UNIQUE 约束来做到这一点吗?
在这种情况下,我如何在 postgreSQL 中执行此操作?
编辑
是的,我想要的是对三个 table 的某种唯一约束。 Table 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
那么可以这样做吗?
我最终通过在插入每个几何体 table 之前触发一个函数来获得结果,以确保我要插入的标识符不存在于其他几何体 tables.
编辑
函数
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();
我在 postgreSQL 中有四个 tables 如下:
Table A Table A_POINTS Table A_LINES TABLE A_POLYGONS
----------------- ---------------- -------------- ----------------
id / colum1 / ... id/ the_geom id / the_geom id/ the_geom
我想确保 table A 中的一个元素只存在于一个几何体 table 中。
我可以通过在几何 table 中设置 id UNIQUE 约束来做到这一点吗? 在这种情况下,我如何在 postgreSQL 中执行此操作?
编辑
是的,我想要的是对三个 table 的某种唯一约束。 Table 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
那么可以这样做吗?
我最终通过在插入每个几何体 table 之前触发一个函数来获得结果,以确保我要插入的标识符不存在于其他几何体 tables.
编辑
函数
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();