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
相关产品推荐
相关产品推荐

