联合主键要求所有参与字段必须为NOT NULL,否则MySQL报ERROR 1072;需在DBeaver“列”页确认各字段已勾选NOT NULL,再于“约束”页通过“新建主键约束”弹窗一次性选择全部字段,并核对SQL预览中为ADD PRIMARY KEY (a,b)格式。

在 DBeaver 的“约束”页添加联合主键时,字段必须全为 NOT NULL
联合主键要求所有参与列都非空,否则 DBeaver 会静默忽略该字段或执行时报错 ERROR 1072 (42000)。这不是 UI 失效,而是 MySQL 底层限制。
- 进表设计页 → 切换到 “列”选项卡 → 逐个确认目标字段勾选了
NOT NULL - 若字段类型是
VARCHAR,建议显式指定字符集:VARCHAR(50) CHARACTER SET utf8mb4,避免某些 MySQL 版本拒绝建主键 - 字段名大小写要和实际定义完全一致;DBeaver 下拉选择时不会自动补反引号,但手动输入带
`会出错
用“新建主键约束”设置多列时,必须在弹窗中一次性勾选全部字段
DBeaver 不支持像 Navicat 那样 Ctrl 多选后右键设主键,也不像 MySQL Workbench 那样靠 PK 列图标切换——它只在“约束”页的弹窗里做批量选择。
- 打开表 → 点击 “约束”选项卡 → 右键空白处 → “新建主键约束”
- 弹窗中左侧字段列表里,按住 Ctrl 多选(Windows)或 Command(macOS)所有要参与的列
- 点确定后,保存前务必点工具栏的
SQL Preview按钮,核对生成语句是否形如ADD PRIMARY KEY (`a`, `b`, `c`),而非单列或 MODIFY COLUMN
执行失败常见原因:字段还没真正存入表结构,或已存在重复值
很多人点了“保存”就以为完事,其实 DBeaver 是分两步:先改内存中的表定义,再发 ALTER 语句到数据库。中间任何一步断开或校验失败都会卡住。
- 如果字段是刚新增但没点“保存列定义”,它们在数据库里还不存在 → 联合主键引用的列“不存在”,报
ERROR 1072 - 若表中已有数据,且联合字段组合存在重复(比如两条记录都是
(1, '2023-01-01')),MySQL 会直接拒绝建主键,错误信息是ERROR 1062 (23000): Duplicate entry - 执行前用
SELECT a, b, COUNT(*) FROM t GROUP BY a, b HAVING COUNT(*) > 1;扫一遍重复值
别混淆“虚拟主键”和“物理主键”:联合主键只能设物理的
右键表选“Edit Virtual Keys”只能设虚拟主键,它不改数据库、不加索引、不保证唯一性,只影响 DBeaver 自己生成的 UPDATE/DELETE WHERE 条件。你要的是数据库级的联合主键约束,必须走“约束”页 + “新建主键约束”流程。
- 虚拟主键设置后,表名旁会出现小钥匙图标,但数据页里仍显示“no primary key”警告
- 物理主键建好后,字段旁会显示小灯泡图标,且
SHOW CREATE TABLE能查到PRIMARY KEY (`x`,`y`) - 如果误设了虚拟主键又想删,右键表 → “Edit Virtual Keys” → 清空列表 → OK 即可,不影响真实结构


















