插入时的Upsert触发器保留更新行为

时间:2015-04-08 04:12:19

标签: sql postgresql triggers

我正在尝试使用插入触发器来辅助一些数据导入脚本。

如果已在数据库中找到该行,我想自动更新一行,但我不希望在此过程中丢失数据

此触发器将执行upsert

但是在某些情况下它会覆盖预先存在的数据。

CREATE TABLE users (
    id serial primary_key
    foo int null,
    bar int default 9001,
    baz int null
);

CREATE FUNCTION upsert() RETURNS TRIGGER AS
$$
BEGIN
    LOOP
        -- first try to update the key
        UPDATE users 
        SET name = NEW.name,
            foo = NEW.foo,
            bar = NEW.bar,
            baz = NEW.baz,
            modified_at = NOW()
        WHERE id = NEW.id;

        IF found THEN
            RETURN NULL;
        END IF;

        RETURN NEW;
    END LOOP;
END;
$$
LANGUAGE plpgsql;

CREATE TRIGGER upsert_trigger BEFORE INSERT ON users 
FOR EACH ROW EXECUTE upsert();

我想在自动数据加载过程中只添加/更新数据,而不是恢复为默认值或为null。

INSERT INTO users(id, foo, bar, baz) VALUES (1, 2, 3, 4);
INSERT INTO users(id, foo) VALUES (1, 10);

会导致

id: 1, 
foo: 10,
bar: 9001,
baz: null

什么时候我真的想要

id: 1, 
foo: 10,
bar: 3,
baz: 4

我可以使用纯plpgsql吗?

翻转它并使其成为尝试插入的更新触发器会更有意义吗?

另外,由于我将插入/更新大量数据集,因此性能至关重要。

0 个答案:

没有答案