我正在运行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
,触发器将被忽略?
答案 0 :(得分:2)
首先-我相信,如果您想在表中具有唯一字段-那么将其标记为这样最简单:
https://www.postgresql.org/docs/current/ddl-constraints.html#DDL-CONSTRAINTS-UNIQUE-CONSTRAINTS
如果尝试在此类字段上插入不应引发错误,则存在ON CONFLICT
关键字:
https://www.postgresql.org/docs/current/sql-insert.html
特别是:ON CONFLICT DO NOTHING
答案 1 :(得分:1)
让数据库管理唯一性!这样可以确保插入和更新的数据完整性。
这很简单:
alter table test add constraint unq_test_test_id unique (test_id);
如果一次插入一行,那很好。插入(或更新)将失败。
如果您要插入多行并允许非重复插入,请使用on conflict
:
insert into test ( . . . )
select . ..
from . . .
on conflict on constraint unq_test_test_id do nothing;