PostgreSQL执行含IF NOT EXISTS的建库表脚本报错,求助正确实现方式
解决PostgreSQL下创建数据库和表的语法问题
你的脚本是SQL Server语法,但你用的是PostgreSQL的psql客户端(通过\i命令执行脚本),两者语法不兼容,所以报错。以下是修改后的可执行脚本,以及关键修改点说明:
修改后的完整脚本
-- 检查数据库abc是否存在,不存在则创建 DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_database WHERE datname = 'abc') THEN CREATE DATABASE abc; END IF; END $$; -- 切换到abc数据库(psql客户端命令) \c abc -- 设置兼容选项(PostgreSQL默认已开启,可保留) SET ANSI_NULLS ON; SET QUOTED_IDENTIFIER ON; -- 创建DEMOGRAPHICS表 CREATE TABLE dbo.DEMOGRAPHICS( caseid bigint NULL, primaryid bigint NULL, caseversion int NULL, fda_dt int NULL, I_F_COD varchar(1) NULL, event_dt int NULL, AGE float NULL, Gender varchar(3) NULL, COUNTRY_CODE varchar(2) NULL, Period varchar(4) NULL );
关键修改点说明
- 数据库存在性检查:PostgreSQL没有
sys.databases,改用系统表pg_database,通过datname字段判断数据库名;用DO $$ ... END $$包裹逻辑块,这是PostgreSQL的匿名代码块语法,必须完整闭合$$。 - 批处理分隔符:去掉SQL Server的
GO,PostgreSQL用分号;分隔语句,切换数据库用psql客户端命令\c abc。 - 标识符引用:去掉SQL Server的方括号
[],PostgreSQL中标识符如果是小写且无特殊字符,直接书写即可;如果需要保留大小写,用双引号""(比如"DEMOGRAPHICS")。 - 冗余设置:
SET ANSI_NULLS ON和SET QUOTED_IDENTIFIER ON在PostgreSQL中默认已开启,可根据需求保留。
执行脚本时,直接在psql中运行\i 'D:/Project/data/Create database tables.sql';即可。
内容的提问来源于stack exchange,提问作者tomasz
相关产品推荐
相关产品推荐

