DBeaver中PostgreSQL的user_id列重置为1及主键自增设置问题
问题解答
1. 为什么手动输入的user_id值会重置为1?
有两种最可能的原因:
- 列设置了默认值1且未提交事务:你在创建表时可能不小心给
user_id列设置了DEFAULT 1,而且DBeaver默认处于手动提交模式——你编辑数据后没有点击工具栏的「提交」(Commit)按钮,导致修改只停留在客户端缓存,刷新后数据库返回默认值1。 - 误设为生成列:如果
user_id被设为生成列(比如GENERATED ALWAYS AS (1) STORED),数据库会自动将该列的值计算为1,完全忽略手动输入的内容。
2. 如何将user_id设为自动编号的主键?
PostgreSQL实现自动编号主键有两种主流方式,下面提供SQL命令和DBeaver界面操作两种方法:
方法一:使用SQL命令
情况1:新建表时直接设置
推荐用PostgreSQL 10+支持的IDENTITY类型(比传统SERIAL更标准):
CREATE TABLE "user" ( user_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, -- 这里添加你的其他列,比如username VARCHAR(50) NOT NULL );
如果用传统SERIAL(本质是自动创建序列+默认值+主键):
CREATE TABLE "user" ( user_id SERIAL PRIMARY KEY, -- 其他列... );
注意:
user是PostgreSQL的保留字,所以表名需要用双引号括起来,或者改为users避免语法冲突。
情况2:修改已存在的表
如果已经创建了user表,user_id是INT类型:
- 先删除可能存在的默认值(如果之前设了
DEFAULT 1):
ALTER TABLE "user" ALTER COLUMN user_id DROP DEFAULT;
- 给列添加自动编号属性并设置为主键:
用IDENTITY的方式:
ALTER TABLE "user" ALTER COLUMN user_id ADD GENERATED ALWAYS AS IDENTITY; ALTER TABLE "user" ADD PRIMARY KEY (user_id);
用序列的方式(等价于SERIAL的底层实现):
-- 创建关联到user_id的序列 CREATE SEQUENCE user_user_id_seq OWNED BY "user".user_id; -- 设置列的默认值为序列的下一个值 ALTER TABLE "user" ALTER COLUMN user_id SET DEFAULT nextval('user_user_id_seq'); -- 添加主键约束 ALTER TABLE "user" ADD PRIMARY KEY (user_id);
方法二:DBeaver界面操作
- 右键点击
user表,选择「编辑表」; - 在「列」标签页选中
user_id列:- 类型选择
SERIAL,或者选择INT后在右侧属性里勾选「Identity」(不同版本可能显示为「自动递增」); - 在「约束」标签页,勾选「主键」选项;
- 类型选择
- 点击「应用」保存更改,DBeaver会自动生成对应的SQL执行。
内容的提问来源于stack exchange,提问作者chappie
相关产品推荐
相关产品推荐

