插入数据时如何将一张表的字段值同步插入到另一张指定表中
问题修复方案
核心错误原因
- 触发器函数内直接引用
users.uuid属于语法错误,PostgreSQL行级INSERT触发器的新插入行所有字段值都存储在系统内置的NEW变量中,直接读取NEW.uuid即可获取刚插入的用户UUID - 创建触发器时无需额外传递
users.uuid参数,NEW变量会由触发器自动注入到函数中,不需要手动传参
可直接运行的正确代码
触发器函数定义
CREATE OR REPLACE FUNCTION test() RETURNS trigger AS ' BEGIN -- 直接取NEW中存储的新插入users行的uuid值插入health表 INSERT INTO health(uuid) VALUES (NEW.uuid); RETURN NEW; END; ' LANGUAGE plpgsql;
触发器创建语句
CREATE TRIGGER test_trigger AFTER INSERT ON users FOR EACH ROW EXECUTE PROCEDURE test();
Spring JPA适配优化
你提到的单引号特殊处理是为了适配Spring JPA,更推荐使用PostgreSQL的美元引用符替换函数体外层的单引号,可避免单引号转义的繁琐操作,适配性更好,优化后的函数定义如下:
CREATE OR REPLACE FUNCTION test() RETURNS trigger AS $$ BEGIN INSERT INTO health(uuid) VALUES (NEW.uuid); RETURN NEW; END; $$ LANGUAGE plpgsql;
你提到的health表没有对应行的问题不影响逻辑,该触发器本身就是在新增用户后主动创建对应的health记录,不需要提前存在对应数据做比对。
内容的提问来源于stack exchange,提问作者Guga Gamer
相关产品推荐
相关产品推荐

