行子集的Postgres约束



我有一个包含任务(tasks(的Postgres表。一个任务可以使用链接表(links(链接到许多实体。任务可以是多种类型中的一种。

由任务类型表示的任务子集(我们称之为S(只能链接到一个实体。也就是说,在link中,可以正好有一条记录具有该任务的ID/主键。

有没有一种方法可以将其编码到Postgres约束中,以便自动管理?

我使用触发器找到了一个解决方案:

CREATE OR REPLACE FUNCTION unique_link() RETURNS trigger AS $unique_link$
DECLARE
t_type text;
link_ct int;
BEGIN
SELECT task_type INTO STRICT t_type FROM tasks WHERE id = NEW.task_id;
IF t_type = 'S' THEN
SELECT COUNT(*) INTO STRICT link_ct FROM links
WHERE task_id = NEW.task_id
IF link_ct > 0 THEN
RAISE EXCEPTION '% of type % already has a link associated', NEW.task_id, t_type;
END IF;
RETURN NEW;
END IF;
RETURN NEW;
END;
$unique_link$ LANGUAGE plpgsql;
CREATE TRIGGER unique_link BEFORE INSERT OR UPDATE ON links
FOR EACH ROW EXECUTE PROCEDURE unique_link();

最新更新