在psql中执行建表SQL脚本时遭遇IDENTITY与NONCLUSTERED语法错误
问题分析与解决方案
你的脚本是SQL Server专属语法,但你用的是PostgreSQL的psql工具执行,两者语法不兼容,所以才会报错。下面是具体问题和修正后的脚本:
错误点解析
IDENTITY(1,1):这是SQL Server的自增列写法,PostgreSQL里有两种替代方式:- PostgreSQL 10及以上版本:用
GENERATED AS IDENTITY - 旧版本:用
SERIAL(本质是自动创建序列+绑定默认值)
- PostgreSQL 10及以上版本:用
NONCLUSTERED INDEX:SQL Server的非聚集索引关键字,PostgreSQL里没有这个概念,默认创建的B-tree索引就是非聚集的,直接写CREATE INDEX即可dboschema:PostgreSQL默认没有dbo这个schema,要么提前创建它,要么改用默认的publicschema
修正后的PostgreSQL兼容脚本
方式1(PostgreSQL 10+推荐)
-- 可选:如果没有dbo schema先创建,也可以直接改用public CREATE SCHEMA IF NOT EXISTS dbo; CREATE TABLE dbo.mytable ( id int NOT NULL GENERATED ALWAYS AS IDENTITY, userID int NULL, Probability DECIMAL(18,8) NULL, Conv_Thresh1 int NULL, Conv_Thresh2 int NULL, DateAddedToDB date NULL ); ALTER TABLE dbo.mytable ADD CONSTRAINT pk_mytable_id PRIMARY KEY (id); CREATE INDEX i1 ON dbo.mytable (userID);
方式2(兼容PostgreSQL旧版本)
CREATE SCHEMA IF NOT EXISTS dbo; CREATE TABLE dbo.mytable ( id SERIAL NOT NULL, userID int NULL, Probability DECIMAL(18,8) NULL, Conv_Thresh1 int NULL, Conv_Thresh2 int NULL, DateAddedToDB date NULL ); ALTER TABLE dbo.mytable ADD CONSTRAINT pk_mytable_id PRIMARY KEY (id); CREATE INDEX i1 ON dbo.mytable (userID);
额外说明
- 你用
\i c:/Users/.../sql_script.sql执行脚本的方式是正确的,问题出在脚本本身的语法适配性 - 如果不需要
dboschema,把所有dbo.替换成public.或者直接去掉即可
内容的提问来源于stack exchange,提问作者blaughli
相关产品推荐
相关产品推荐

