我使用的是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');