You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:48:19