DBeaver本身不直接写入默认值到数据库表结构,仅提供配置入口;真正生效需通过ALTER TABLE或CREATE TABLE等DDL语句在数据库层面定义。

直接说结论:DBeaver 本身不“写入”默认值到数据库表结构里,它只在数据导入、编辑或新建表时提供默认值配置入口;真正生效的默认值必须由 ALTER TABLE ... ALTER COLUMN ... SET DEFAULT(PostgreSQL)或 ALTER TABLE ... MODIFY COLUMN ... DEFAULT(MySQL)等 DDL 语句定义到数据库层面。
新建表时设置默认值(CREATE TABLE 场景)
在 DBeaver 的「新建表」向导中填字段时,每列右侧有「Default value」输入框。这里填的内容会直接生成到 CREATE TABLE 语句里:
- 填
'2024-01-01'→ 生成date_col DATE DEFAULT '2024-01-01' - 填
CURRENT_TIMESTAMP(不加引号)→ 生成ts_col TIMESTAMP DEFAULT CURRENT_TIMESTAMP - 填
nextval('myseq')(PostgreSQL)→ 需确保序列已存在,且权限正确 - 填数字如
0或布尔值TRUE,不加引号,否则会被当字符串处理
⚠️ 容易踩的坑:这个默认值仅对当前建表生效;如果表已存在,改这里不会触发任何 DDL,也不会影响已有数据。
修改已有表字段的默认值(ALTER TABLE 场景)
DBeaver 不提供图形化按钮一键修改默认值,必须手动执行 SQL:
- PostgreSQL:
ALTER TABLE users ALTER COLUMN status SET DEFAULT 'active'; - MySQL:
ALTER TABLE users MODIFY COLUMN status VARCHAR(20) DEFAULT 'active';(注意:MySQL 要重写整个列定义) - 取消默认值:
ALTER TABLE users ALTER COLUMN status DROP DEFAULT;(PostgreSQL)或ALTER TABLE users ALTER COLUMN status DROP DEFAULT;(MySQL 8.0+)
⚠️ 容易踩的坑:MySQL 修改 DEFAULT 会隐式触发表重建(尤其大表),而 PostgreSQL 是轻量元数据更新;执行前务必确认是否允许锁表。
数据导入时临时指定默认值(Import Wizard 场景)
使用 DBeaver 的「导入数据」功能时,在字段映射步骤可为缺失列设置默认值:
- 勾选「Use default value for empty cells」后,空单元格将按目标列的数据库默认值填充
- 若目标列无数据库级默认值,可点击「Edit mapping」→「Default value」栏手动填入表达式,如
'N/A'、0、now() - 该默认值只作用于本次导入,不影响表结构
⚠️ 容易踩的坑:导入时填的 now() 是在 DBeaver 客户端本地执行的函数,不是数据库服务端的 NOW(),时区可能不一致;建议统一用数据库函数并加引号绕过客户端解析,例如填 'NOW()'(让服务端执行)。
编辑数据时让某列自动填默认值(Data Editor 场景)
在结果集表格中新增一行(Ctrl+N),DBeaver 会尝试读取数据库返回的列默认信息,并在新行对应列显示灰色提示文本(如 [DEFAULT])。但实际行为取决于驱动和数据库支持程度:
- PostgreSQL:通常能正确显示并提交默认值
- MySQL:部分驱动版本不返回默认值元数据,新行该列留空,保存时报错或存为
NULL/'' - 解决办法:右键该单元格 →「Set to NULL」或手动输入默认值再保存;更可靠的方式仍是提前在数据库里定义好
DEFAULT约束
⚠️ 容易被忽略的地方:DBeaver 的「默认值」感知能力完全依赖 JDBC 驱动是否如实上报 DatabaseMetaData.getColumnDefaultValue()。如果你发现新建行从不显示默认提示,先检查驱动版本——比如老版 MySQL Connector/J 5.1 就不支持此特性,必须升到 8.0+。











