我在尝试使用Postgres FDW扩展从同一数据库服务器导入外来模式以执行联接查询时遇到错误。下面,为了更清楚起见,我提供了pgAdmin的快照,沿着示例表创建脚本:
-- Create the enumerated type
CREATE TYPE UserType AS ENUM ('INTERNAL', 'EXTERNAL');
-- Create the User table using the enumerated type
CREATE TABLE "users" (
id SERIAL PRIMARY KEY,
type UserType,
created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
字符串
为了将上述数据库及其公共模式导入“阿基勒”数据库,我使用以下代码:
CREATE SCHEMA temp_0_schema;
CREATE EXTENSION IF NOT EXISTS postgres_fdw;
CREATE SERVER temp_0_server
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (dbname 'temp_0', host 'localhost', port '5432');
CREATE USER MAPPING FOR CURRENT_USER
SERVER temp_0_server
OPTIONS (user 'akil', password '');
IMPORT FOREIGN SCHEMA public
FROM SERVER temp_0_server
INTO temp_0_schema;
型
但是,我遇到了以下错误:
ERROR: type "public.usertype" does not exist
LINE 3: type public.usertype OPTIONS (column_name 'type'),
^
QUERY: CREATE FOREIGN TABLE users (
id integer OPTIONS (column_name 'id') NOT NULL,
type public.usertype OPTIONS (column_name 'type'),
created_at timestamp without time zone OPTIONS (column_name 'created_at')
) SERVER temp_0_server
OPTIONS (schema_name 'public', table_name 'users');
CONTEXT: importing foreign table "users"
SQL state: 42704
型
我很难理解错误的性质,并希望了解可能导致此问题的任何见解。
的数据
2条答案
按热度按时间w6mmgewl1#
该错误意味着您忘记在本地数据库中创建
usertype
。如果没有这样做,应该如何定义外部表?请参阅文档:通常建议使用与远程表的引用列完全相同的数据类型和排序规则(如果适用)来声明外部表的列。尽管
postgres_fdw
目前对在需要时执行数据类型转换相当宽容,但当类型或排序规则不匹配时,可能会出现令人惊讶的语义异常,这是由于远程服务器与本地服务器不同地解释查询条件。gjmwrych2#
在文档的下面:
如果要导入的远程表具有用户定义数据类型的列,则本地服务器必须具有同名的兼容类型。
这意味着你需要单独设置匹配的用户定义类型,因为扩展不处理这个问题。检查外部服务器上
public.usertype
的定义,并在本地定义相同的类型:在psql
客户端中,\dT
元命令显示类型定义,而\dt
可以告诉你给定表定义的类型。