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

Insert same UUID into two tables (once as primary key, once as foreign key) in one statement

考虑通过字段 id_data 将两个表 table_geomtable_data 连接在一起的 postgres 视图(id_datatable_data 的主键和table_geom 中的外键):

CREATE OR REPLACE VIEW myschema.view AS 
 SELECT table_geom.geom, table_geom.id_geom, table_geom.id_data,
        table_data.id_data, table_data.data
 FROM myschema.table_geom, myschema.table_data
 WHERE table_geom.id_data = table_data.id_data;

id_geomid_data 是 UUID。我想使用 uuid_generate_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_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);
  );

但是由于 ERROR: cannot refer to NEW within WITH query.

而不起作用

知道如何编写这样的插入规则吗?

由于您在视图上执行 INSERT,建议的过程是在视图上执行 INSTEAD OF INSERT 触发器。在触发器函数中,您将视图上的插入重写为基础表上的两个插入:

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