PostgreSQL,插入前检查是否重复

时间:2019-07-15 08:50:11

标签: sql postgresql

我正在运行PostgreSQL 10,并且在表BEFORE INSERT OR UPDATE上有几个AFTER INSERT OR UPDATEtests

我想要另一个触发器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,触发器将被忽略?

2 个答案:

答案 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;