如何从插入到 postgres foreign table 中获取生成的 id?

How to get the generated id from an insert to a postgres foreign table?

我正在使用 PostgreSQL 13.2 版,我需要插入一个外部 table(还有 Postgres),它有一个序列生成的 ID,从外部返回生成的 ID table.

我添加了“postgres_fdw”扩展,创建了服务器和用户映射。

当我这样做时:

INSERT INTO public.remote_users (name) VALUES ('username') RETURNING id;

使用以下国外table定义:

CREATE FOREIGN TABLE public.remote_users
(
    id bigint,
    name character varying(20)
)
SERVER remote
OPTIONS (schema_name 'public', table_name 'users');

我收到一条错误消息,指出 id 不能为空(因为 fdw 使用 'id' 列构建远程插入语句并且它具有非空约束)。

ERROR: null value in column "id" of relation "users" violates not-null constraint DETAIL: Failing row contains (null, username). CONTEXT: remote SQL command: INSERT INTO public.users(id, name) VALUES (, ) RETURNING id SQL state: 23502

使用这个外国table定义:

CREATE FOREIGN TABLE public.remote_users
(
    name character varying(20)
)
SERVER remote
OPTIONS (schema_name 'public', table_name 'users');

我收到一条错误消息,提示“列“id”不存在”。

有什么方法可以使 INSERT INTO public.remote_users (name) VALUES ('username') RETURNING id; 语句起作用吗?

我找到了解决方法(虽然这不是我想要的解决方案)。

在远程 table 上创建插入前触发器以检查空 ID 并替换为序列值,我可以使用插入(使用指定 id 列的外部 table 定义) .

更明确...

在远程:

CREATE FUNCTION public.users_insert()
    RETURNS trigger
    LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
  IF (new.id IS NULL) THEN
     new.id = nextval('public.users_id_seq'::regclass);
  END IF;
  RETURN new;
END;
$BODY$;

CREATE TRIGGER insert_tr
    BEFORE INSERT
    ON public.users
    FOR EACH ROW
    EXECUTE PROCEDURE public.users_insert();

尝试使用此查询创建 table

CREATE FOREIGN TABLE public.remote_users
(
    id serial,
    name character varying(20)
)
SERVER remote
OPTIONS (schema_name 'public', table_name 'users');