如何从插入到 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');
我正在使用 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');