【发布时间】:2019-07-15 08:50:11
【问题描述】:
我正在运行 PostgreSQL 10,我的桌子上有几个 BEFORE INSERT OR UPDATE 和 AFTER INSERT OR UPDATE tests。
我想要另一个触发器BEFORE INSERT OR UPDATE 来检查潜在的重复行。
我做了这个:
CREATE OR REPLACE FUNCTION set_check_dublicate_on_test() RETURNS trigger AS $$
BEGIN
IF EXISTS (SELECT 1 FROM tests WHERE test_id = NEW.test_id) THEN
RETURN NULL;
ELSE
RETURN NEW;
END IF;
END;
$$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS set_check_dublicate_on_test ON tests;
CREATE TRIGGER set_check_dublicate_on_test BEFORE INSERT OR UPDATE ON tests
FOR EACH ROW EXECUTE PROCEDURE set_check_dublicate_on_test();
但我不确定它是否会与其他 triggers 冲突,或者它会完成目标,如果返回 NULL,触发器将被忽略?
【问题讨论】:
-
使用 test_id 上的唯一索引检查重复值不是更容易吗?
-
在
test_id上创建一个唯一索引,然后使用insert ... on conflict (test_id) do nothing- 不需要触发器。它甚至可以处理相同值的并发插入(触发器将不能够检测到) -
我确实允许
test_id成为NULL,这应该允许insert- 这仍然有效吗? -
@Alfred 有效的评论,但显然它应该仍然有效:见stackoverflow.com/questions/23449207/…)
标签: sql postgresql