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

PostgreSQL如何查询表结构中的字段默认值

解决PostgreSQL中无法获取字段正确默认值的问题

我之前也碰到过一模一样的情况!在PostgreSQL里,information_schema.columns的default_value字段确实不太靠谱——它返回的是数据库存储的原始表达式文本,而不是我们期望的“实际生效的默认值”。比如如果默认值是函数(now())、序列值或者带特殊格式的常量,它会保留表达式的原始写法(甚至带引号),看起来就像没拿到正确结果。

给你两个靠谱的解决方案:

方案1:使用系统表+pg_get_expr解析真实默认值

这个方法能直接获取到和你在CREATE TABLE语句里写的一致的默认值表达式,可读性极强:

SELECT 
    a.attname AS column_name,
    format_type(a.atttypid, a.atttypmod) AS data_type,
    CASE WHEN a.attnotnull THEN 'NO' ELSE 'YES' END AS is_nullable,
    pg_get_expr(d.adbin, d.adrelid) AS default_value
FROM 
    pg_class c
JOIN 
    pg_attribute a ON c.oid = a.attrelid
LEFT JOIN 
    pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
WHERE 
    c.relname = 'USER'
    AND c.relnamespace = 'public'::regnamespace
    AND a.attnum > 0
    AND NOT a.attisdropped
ORDER BY 
    a.attnum;
  • pg_get_expr会把数据库内部存储的默认值二进制表达式转换成人类可读的SQL文本,比如默认值是now()就直接返回now(),而不是带引号的字符串。
  • 过滤掉了已删除的字段(NOT a.attisdropped),避免干扰结果。

方案2:用pg_table_def视图快速查询

如果你想要更简洁的结果,PostgreSQL提供了pg_table_def视图,它已经帮你整理好了常用的表结构信息,包括处理后的默认值:

SELECT 
    column,
    type,
    notnull AS is_nullable,
    default AS default_value
FROM 
    pg_table_def
WHERE 
    schemaname = 'public'
    AND tablename = 'USER';

额外注意点

  • 你的表名USER是PostgreSQL的保留字,虽然当前查询可能没报错,但规范写法建议用双引号括起来,比如"USER",避免潜在的语法冲突。
  • 如果默认值是常量字符串,information_schema.columns的default_value会返回带单引号的版本(比如'default_name'),而上面两种方法会返回不带引号的真实值(default_name),这才是插入数据时实际生效的默认值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:37:08