sql - PostgreSQL,在插入之前检查重复项

标签 sql postgresql

我正在运行 PostgreSQL 10 并且在我的表测试上有几个BEFORE INSERT OR UPDATEAFTER INSERT OR UPDATE

我想要另一个触发器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();

但我不确定它是否会与其他触发器冲突,或者是否会实现目标,如果返回 NULL,触发器将被忽略?

最佳答案

首先 - 我相信如果你想在你的表中有一个唯一的字段 - 那么最简单的方法就是这样标记它:

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

关于sql - PostgreSQL,在插入之前检查重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57036234/

相关文章:

mysql - SQL选择符合条件的数据,先显示,然后对剩余数据进行排序

sql - PL/PgSQL 在 CREATE VIEW 中将变量名视为列名

ruby-on-rails - 使用 ActiveRecord 更新 Postgres JSON 字段

postgresql - Postgres 为少数表备份主数据和模式

PostgreSQL Set-Returning 函数调用优化

mysql - 您将如何合并两个单独查询的结果?

python - 将 python sqlalchemy 类转换为原始 SQL(使用外键创建表)

sql - 如何在 SQL 2005 中获取分区范围

mysql - 在 phpMyAdmin 中导入文本文件

postgresql - 使用ltree Postgres插件仅返回子结构