创建表时varchar字段默认空字符串设置方法及设置后显示异常的问题咨询
创建表时varchar字段默认空字符串设置方法及设置后显示异常的问题咨询
嘿,我来帮你捋清楚这个问题,你遇到的情况其实和PostgreSQL(从语法和类型转换特征来看,你用的应该是这个数据库)的内部存储逻辑以及DBeaver的显示细节有关,咱们一步步拆解:
首先先还原你遇到的场景:
你在DBeaver里执行了这条建表语句:
create table test ( id varchar(36) not null primary key, key varchar(120) not null default '' );
之后你做了两件事:
- 在DBeaver里查看该表的DDL,发现
key字段的默认值显示为NULL::character varying - 执行元数据查询语句:
select column_name, column_default, is_nullable from information_schema.columns where table_name = 'test'
结果里key字段的column_default同样显示为NULL::character varying
这看起来和你设置的default ''完全不符,对吧?别担心,其实你的默认值设置是正常生效的,这只是显示层面的小问题,咱们来验证下:
你可以尝试插入一条不指定key字段的记录:
insert into test (id) values ('123e4567-e89b-12d3-a456-426614174000');
然后查询这条记录的key值:
select key from test where id = '123e4567-e89b-12d3-a456-426614174000';
你会发现结果是''(空字符串),而不是NULL,这就说明你设置的默认值是正常工作的。
那为什么DDL和元数据查询会显示异常呢?
这是因为PostgreSQL在处理非空字符类型字段的空字符串默认值时,内部存储的元数据会有特殊处理,而DBeaver在读取这些元数据生成DDL时,或者information_schema.columns的column_default字段在展示时,会出现这种看似错误的显示,但实际的约束和默认值逻辑都是正确的。
如果你想看到数据库真正存储的默认值定义,可以用PostgreSQL的系统函数pg_get_expr来查询:
SELECT pg_get_expr(adbin, adrelid) as actual_default FROM pg_attrdef WHERE adrelid = 'test'::regclass AND adnum = ( SELECT attnum FROM pg_attribute WHERE attrelid = 'test'::regclass AND attname = 'key' );
执行这条语句后,你会得到真正的默认值'',这也进一步确认了数据库内部是正确保存了你的设置的。
总结一下:
- 你设置
default ''的方式完全正确,且实际生效 - DBeaver的DDL显示和
information_schema的查询结果只是展示层面的小问题,不影响功能使用 - 可以通过
pg_get_expr函数验证字段的真实默认值
内容来源于stack exchange
相关产品推荐
相关产品推荐

