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

如何获取PostgreSQL中创建约束的SQL语句?

在PostgreSQL中获取约束的SQL语句

PostgreSQL没有名为pg_constraints的表,但可以通过系统视图pg_constraint搭配内置函数pg_get_constraintdef()生成创建约束的完整SQL语句,以下是具体实现方案:

一、获取所有用户自定义约束的创建SQL

这个查询会返回主键、外键、唯一约束、检查约束的完整创建语句,自动处理带特殊字符的表名/约束名:

SELECT
    conname AS 约束名称,
    conrelid::regclass AS 所属表,
    CASE contype
        WHEN 'p' THEN '主键约束'
        WHEN 'f' THEN '外键约束'
        WHEN 'u' THEN '唯一约束'
        WHEN 'c' THEN '检查约束'
        WHEN 'x' THEN '排除约束'
    END AS 约束类型,
    pg_get_constraintdef(c.oid) AS 约束定义,
    -- 拼接完整的创建语句
    'ALTER TABLE ' || quote_ident(nspname) || '.' || quote_ident(conrelid::regclass::text) || 
    ' ADD CONSTRAINT ' || quote_ident(conname) || ' ' || pg_get_constraintdef(c.oid) || ';' AS 完整创建SQL
FROM pg_constraint c
JOIN pg_namespace n ON n.oid = c.connamespace
WHERE contype IN ('c', 'f', 'p', 'u', 'x')
  AND conrelid != 0 -- 仅针对表的约束,排除域等其他对象的约束
  AND NOT conislocal; -- 排除系统自动生成的约束(如主键对应的隐式索引约束)

二、单独获取非空约束的创建SQL

非空约束在pg_constraint中归类为检查约束(contype='c'),可以用以下查询单独提取:

SELECT
    'ALTER TABLE ' || quote_ident(nspname) || '.' || quote_ident(conrelid::regclass::text) ||
    ' ALTER COLUMN ' || quote_ident(a.attname) || ' SET NOT NULL;' AS 非空约束创建SQL
FROM pg_constraint c
JOIN pg_namespace n ON n.oid = c.connamespace
JOIN pg_attribute a ON a.attrelid = c.conrelid AND a.attnum = ANY(c.conkey)
WHERE contype = 'c' 
  AND concheck = '(NOT (' || quote_ident(a.attname) || ' IS NULL))';

三、用pg_dump导出约束

如果需要快速导出特定表/模式的所有约束,可以用pg_dump命令行工具:

# 导出指定表的所有约束(仅模式定义)
pg_dump -t '你的模式名.你的表名' --schema-only -d 你的数据库名 | grep -E '(CONSTRAINT|ALTER TABLE)'

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:20:45