Postgres:检查两个框是否重叠
Postgres: Check if two boxes overlap
我目前在数据库中有以下表格:
create table map (
id bigint not null unique,
zone box not null,
...
primary key(id)
);
create table other_map (
id bigint not null unique,
zone box not null,
...
primary key(id),
foreign key(id) references map(id)
);
如果 map
中有一行 id
等于新条目的 [=14],我不想在 other_map
中插入新行=] 和它们的zone
属性重叠。我找到了 this answer,它解释了如何检测重叠框,但我想知道如何(最好地)在 Postgres 中应用它。
这是我到目前为止使用触发器和存储过程得出的结果:
CREATE OR REPLACE FUNCTION PROC_other_map_IU()
RETURNS TRIGGER AS $PROC_other_map_IU$
DECLARE
id bigint;
zone box;
BEGIN
SELECT map.id, map.zone INTO id, zone
FROM map
WHERE map.id = NEW.id;
IF zone = NEW.zone THEN
RAISE EXCEPTION '%\'s zone overlaps with existing %\'s zone', NEW.id, id;
END IF;
RETURN NEW;
END;
$PROC_other_map_IU$ LANGUAGE plpgsql;
CREATE TRIGGER TR_other_map_IU
AFTER INSERT OR UPDATE
ON other_map
FOR EACH ROW EXECUTE PROCEDURE PROC_other_map_IU();
现在显然这是错误的,因为它只是检查 zone
属性是否相等。
提前感谢您的输入!干杯!
花了我一段时间,但 Postgres 的 geometric functions and operators(更具体地说是 &&
- 或重叠 - 运算符)完全符合我的要求:
IF zone && NEW.zone THEN
我目前在数据库中有以下表格:
create table map (
id bigint not null unique,
zone box not null,
...
primary key(id)
);
create table other_map (
id bigint not null unique,
zone box not null,
...
primary key(id),
foreign key(id) references map(id)
);
如果 map
中有一行 id
等于新条目的 [=14],我不想在 other_map
中插入新行=] 和它们的zone
属性重叠。我找到了 this answer,它解释了如何检测重叠框,但我想知道如何(最好地)在 Postgres 中应用它。
这是我到目前为止使用触发器和存储过程得出的结果:
CREATE OR REPLACE FUNCTION PROC_other_map_IU()
RETURNS TRIGGER AS $PROC_other_map_IU$
DECLARE
id bigint;
zone box;
BEGIN
SELECT map.id, map.zone INTO id, zone
FROM map
WHERE map.id = NEW.id;
IF zone = NEW.zone THEN
RAISE EXCEPTION '%\'s zone overlaps with existing %\'s zone', NEW.id, id;
END IF;
RETURN NEW;
END;
$PROC_other_map_IU$ LANGUAGE plpgsql;
CREATE TRIGGER TR_other_map_IU
AFTER INSERT OR UPDATE
ON other_map
FOR EACH ROW EXECUTE PROCEDURE PROC_other_map_IU();
现在显然这是错误的,因为它只是检查 zone
属性是否相等。
提前感谢您的输入!干杯!
花了我一段时间,但 Postgres 的 geometric functions and operators(更具体地说是 &&
- 或重叠 - 运算符)完全符合我的要求:
IF zone && NEW.zone THEN