如何获取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
相关产品推荐
相关产品推荐

