PgAdmin无法创建表,历史可用CREATE TABLE语句执行报语法错误如何解决
问题原因
该报错和PgAdmin版本变动无关,是PostgreSQL语法解析时将内置类型text识别为了普通标识符导致的,常见触发场景有三种:
- 当前会话或当前数据库中存在和
text重名的自定义对象(比如自定义类型、函数、临时变量),优先级高于内置数据类型 - 之前执行过
search_path修改操作,把包含重名对象的schema调整到了pg_catalog前面,导致内置类型没有被优先识别 - 执行时选中的SQL片段不全,前面多带了未闭合的引号、括号等字符,导致解析位置偏移
解决方案
- 排查重名对象:执行语句
SELECT typnamespace::regnamespace, * FROM pg_type WHERE typname = 'text',如果返回结果里存在非pg_catalogschema的text类型,删除该自定义对象即可 - 临时规避语法报错:给内置类型加上
pg_catalog前缀强制指定系统内置类型,修改建表语句为:
CREATE TABLE food ( "meat" pg_catalog.text, "veggies" pg_catalog.text );
- 修复搜索路径配置:执行
SHOW search_path;检查当前搜索路径,调整配置把pg_catalog放到最前面:SET search_path = pg_catalog, public; - 重置会话状态:关闭当前PgAdmin查询窗口,打开新的查询窗口重新执行语句,清空之前会话的临时配置、自定义变量
内容的提问来源于stack exchange,提问作者gooby
相关产品推荐
相关产品推荐

