Postgresql 在一条语句中将相同的UUID插入到两个表中(一次作为主键,一次作为外键)
考虑postgres视图,该视图通过字段Postgresql 在一条语句中将相同的UUID插入到两个表中(一次作为主键,一次作为外键),postgresql,Postgresql,考虑postgres视图,该视图通过字段id\u data将两个表table\u geom和table\u data连接在一起(id\u data是table\u geom中的主键和外键): id\u geom和id\u data是UUID。我想在插入时使用uuid\u generate\u v4()和如下规则自动生成它们 CREATE OR REPLACE RULE view_insert_rule AS ON INSERT TO myschema.view DO INSTEAD (
id\u data
将两个表table\u geom
和table\u data
连接在一起(id\u data
是table\u geom
中的主键和外键):
id\u geom
和id\u data
是UUID。我想在插入时使用uuid\u generate\u v4()
和如下规则自动生成它们
CREATE OR REPLACE RULE view_insert_rule AS
ON INSERT TO myschema.view DO INSTEAD (
INSERT INTO myschema.table_geom (geom, id_geom, id_data) VALUES (new.geom, (select uuid_generate_v4()), $ID_DATA$);
INSERT INTO myschema.table_data (id_data, data) VALUES ($ID_DATA$, new.data);
);
问题:$ID\u DATA$
在插入两个表时需要使用相同的UUID
一次尝试是
CREATE OR REPLACE RULE view_insert_rule AS
ON INSERT TO myschema.view DO INSTEAD (
WITH ins_data as (
INSERT INTO myschema.table_data (id_data, data) VALUES ((select uuid_generate_v4()), new.data) RETURNING id_data
)
INSERT INTO myschema.table_geom (geom, id_geom, id_data) VALUES (new.geom, (select uuid_generate_v4()), ins_data.id_data);
);
但是,由于错误,无法在查询中引用新的
知道如何编写这样的插入规则吗?因为您正在视图上执行插入
,建议使用而不是视图上的插入触发器。在触发器函数中,将视图上的插入重写为基础表上的两个插入:
CREATE FUNCTION insert_new_uuids() RETURNS trigger AS $$
DECLARE
new_id uuid;
BEGIN
new_id := uuid_generate_v4();
INSERT INTO myschema.table_data (id_data, data) VALUES (new_id, NEW.data);
INSERT INTO myschema.table_geom (geom, id_geom, id_data) VALUES (NEW.geom, uuid_generate_v4(), new_id);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER ins_view
INSTEAD OF INSERT ON myschema."view"
FOR EACH ROW EXECUTE PROCEDURE insert_new_uuids();
CREATE FUNCTION insert_new_uuids() RETURNS trigger AS $$
DECLARE
new_id uuid;
BEGIN
new_id := uuid_generate_v4();
INSERT INTO myschema.table_data (id_data, data) VALUES (new_id, NEW.data);
INSERT INTO myschema.table_geom (geom, id_geom, id_data) VALUES (NEW.geom, uuid_generate_v4(), new_id);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER ins_view
INSTEAD OF INSERT ON myschema."view"
FOR EACH ROW EXECUTE PROCEDURE insert_new_uuids();