Postgresql 在一条语句中将相同的UUID插入到两个表中(一次作为主键,一次作为外键)

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 (

考虑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 (
    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();