DBeaver新建表需先连接并完全展开数据库节点至Tables文件夹,右键Tables才能启用“新建表”;字段自增、主键、唯一约束等须在对应标签页显式配置,外键不支持图形化创建;点击Apply执行生成的DDL,失败需检查SQL预览并刷新视图。

直接说结论:DBeaver 新建表不靠写 SQL,而是用图形化表设计器完成,但必须先连上数据库、选对 Schema(或 Database),否则“新建表”选项是灰色不可点的。
为什么右键“表”没反应,或者“新建表”是灰色?
这是最常卡住的第一步。DBeaver 不像本地软件那样“新建空白项目”,它所有操作都依附于一个已连接且已展开的数据库节点。
- 确认左侧导航树中,目标数据库(比如
mydb)已经**完全展开**——看到 “Schemas” 或 “Public” 或具体 schema 名,再往下有 “Tables” 文件夹;如果只显示数据库名但没展开,右键它并选 “Connect” 或 “Refresh” - MySQL/PostgreSQL 等多数数据库里,“新建表”菜单实际藏在 **
Tables文件夹上右键**,不是在数据库名上右键(数据库名上右键通常是“Create Database”) - 如果用了 PostgreSQL 且没选 schema(如
public),即使连上了,Tables节点也可能为空或禁用;需先展开到具体 schema 层级 - 连接时若未勾选 “Include all schemas”(PostgreSQL)或未指定默认 database(MySQL),会导致对象列表不全
添加字段时 INT 类型不带自增,怎么设 auto_increment / SERIAL?
DBeaver 的字段类型下拉菜单里写的 INTEGER 或 INT 是通用写法,是否自增取决于你是否勾选了对应属性,而不是类型名本身。
- MySQL:添加字段后,在右侧属性面板中勾选
Auto-increment(会自动补上NOT NULL和PRIMARY KEY建议,但主键仍需手动设) - PostgreSQL:类型选
SERIAL或BIGSERIAL即可(这是语法糖,等价于INTEGER+ 序列 + 默认值);若选INTEGER,则需在Default value栏手动填nextval('xxx_seq'::regclass),不推荐新手手写 - SQL Server:类型选
INT,然后勾选Identity属性 - 注意:
Auto-increment勾选后,DBeaver 才会在生成的 DDL 中写AUTO_INCREMENT或GENERATED ALWAYS AS IDENTITY,否则只是普通数字列
主键、非空、唯一约束不是勾一下就生效的
在表设计器里勾选 Not null 只影响单字段,而主键和唯一约束是独立对象,必须通过“Constraints”标签页显式创建。
- 设主键:切到
Constraints标签 → 点击 “+” → 类型选Primary key→ 在下方 “Columns” 列表里勾选要组成的字段(单列就勾一个) - 设唯一约束:同上,类型选
Unique key→ 添加对应列 → 可选填约束名(如uk_email) - 外键不能在建表时一步完成:DBeaver 表设计器不支持图形化创建外键(FK),必须切到
Foreign keys标签页手动添加,或建完表后用 SQL 修改 - 所有约束名(
PK_user_id、CK_age_check)最好自己命名,否则 DBeaver 自动生成的名(如constr_12345)难以维护
点“Apply”没反应,或提示“Error executing DDL”
这不是界面卡死,而是 DBeaver 把你设计的操作转成了真实 SQL 并提交执行,失败会报错,成功才真建表。
- 点
Apply后弹出窗口里,务必看清楚顶部 SQL 预览 —— 检查CREATE TABLE语句是否含IF NOT EXISTS(默认没有),重复执行会报错 - 常见报错:
ERROR: column "xxx" does not exist(字段名拼错)、ERROR: type "jsonb" does not exist(PostgreSQL 未启用jsonb扩展)、ERROR: Specified key was too long(MySQL 字符串主键超 767 字节) - 执行失败时,窗口不会自动关闭,可以改完再点
Retry;成功后记得手动右键数据库或Tables节点点Refresh,否则新表不显示 - 如果想留痕,勾选
Save script to file,DBeaver 会把这次生成的 DDL 存成 .sql 文件,比截图靠谱得多
真正容易被忽略的是:DBeaver 的表设计器本质是 DDL 生成器,它不验证逻辑合理性(比如两个 NOT NULL 字段都没设默认值,插入时必报错),也不检查跨表引用完整性。建完表,立刻用 SELECT * FROM xxx LIMIT 1 测试能不能查,比盯着界面点十次“Apply”更有意义。


















