如何将生成的id从insert获取到postgres外部表



我使用的是PostgreSQL 13.2版本,我需要插入到一个外部表(Postgres也是(中,该表具有序列生成的id,从外部表返回生成的id。

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

当我这样做时:

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

使用以下外来表格定义:

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

我收到一个错误,说id不能为null(因为fdw使用"id"列构建远程插入语句,并且它有一个非null约束(。

错误:列中的空值"id";关系式";用户";违反非null约束详细信息:失败行包含(null,username(。上下文:远程SQL命令:INSERT INTO public.users(id,name(VALUES($1,$2(RETURNING idSQL状态:23502

使用此外部表定义:

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;语句起作用吗?

我找到了一个变通方法(尽管这不是我想要的解决方案(。

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

更明确地说。。。

远程:

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

尝试此查询以创建表

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

相关内容

  • 没有找到相关文章

最新更新