postgresql自增序列和自增重设

postgresql的自增id

postgresql的自增id通过serial类型进行定义

类型大小/bytes范围
smallserial22^15-1
serial42^31-1
bigserial82^63-1
##创建自增id为主键的tb_aa表
CREATE TABLE tb_aa (
	id serial NOT NULL,
	user_id int4 NOT NULL,
	status varchar(5) NOT NULL DEFAULT '1'::character varying,
	update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
	create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
	CONSTRAINT tb_aa_pk PRIMARY KEY (id),
	CONSTRAINT tb_aa_user_id_key UNIQUE (user_id)
);

##创建自增id实际执行:
CREATE TABLE tb_aa (
id integer not null default('tb_aa_id_seq'),
...
);

alter sequence tb_aa_id_seq owned by tb_aa.id;
##获取serial序列名称
select pg_get_serial_sequence('tb_aa','id');

##获取序列的最大id值
select setval('tb_aa_id_seq', max(id)) from tb_aa;

serial重设

问题:在批量插入数据后,手动删除后,重新批量插入导致出现主键冲突的错误
SQL 错误 [23505]: ERROR: duplicate key value violates unique constraint “tb_aa_pk”
Detail: Key (id)=(11) already exists.

可能原因:
1.同时写入导致的冲突
2.自增id出现断层在批量插入数据的时候,显示主键冲突

##重新设置起始序列
alter sequence tb_aa_id_seq restart with 4;

##查看下一个序列号
select nextval('tb_aa_id_seq');

清空表后的自增id重设

##插入数据测试
insert into tb_aa(user_id) values(1),(2),(3),(4),(5),(6),(7);
select * from tb_aa;
truncate table tb_aa;

##自增id从8开始
insert into tb_aa(user_id) values(1),(2),(3),(4),(5),(6),(7);

##清空并重设
truncate table tb_aa cascade; 
truncate tb_aa restart identity cascade;

##自增id从1开始
insert into tb_aa(user_id) values(1),(2),(3),(4),(5),(6),(7);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值