我正在尝试使用插入触发器来辅助一些数据导入脚本。
如果已在数据库中找到该行,我想自动更新一行,但我不希望在此过程中丢失数据
此触发器将执行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吗?
翻转它并使其成为尝试插入的更新触发器会更有意义吗?
另外,由于我将插入/更新大量数据集,因此性能至关重要。