ORACLE数据库数据id重置连续排序

1、## 背景
之前操作oracle数据库采用触发器+序列模式生成的主键自增
然后DBA迁库时把触发器搞丢了,期间部分数据被删除(即数据库id出现了断层)
新建的触发器生成的数据id与旧数据id产生冲突
需要新建触发器并且将数据id重置为从1开始的连续自增,并且新生成的数据id在最大id连续排序
2、创建新模式ORACLE自带的触发器模式(数据库id连续存在时可直接用这个操作)

<!--创建触发器,主键为空是后自增1-->
alter table 表名 add id_new NUMBER(38,0) generated by default on null as identity;
<!--将新的旧的id数据给新字段赋值,过程中新触发器会自动变更nextval值-->
update 表名 set id_new = id;
<!--删除之前的id字段-->
alter table 表名 drop column id;
<!--将新id字段名改为原字段名-->
alter table 表名 rename column id_new to id;

3、创建新模式ORACLE自带的触发器模式(数据库id有部分数据被删除了,之后的页面操作保存数据会报错,id唯一检验)
在2、的基础上操作如下sql:

<!-- 查看当前用户下所有的序列-->
SELECT SEQUENCE_NAME  FROM all_sequences;
<!-- 找到表对应的序列(目前存在的表序列如:id自增序列)-->
<!--创建一个新的序列,步长为11开始自增,最小为1-->
CREATE SEQUENCE 新序列名称 increment by 1 start with 1 minvalue 1;
<!--修改表的id为新序列的值,就是把id值重置重新排序(不间断连续排序)-->
update 表名 set id = 新序列名称.nextval
<!--将新的序列与表id重新绑定-->
ALTER TABLE 表名 MODIFY ID NUMBER DEFAULT 新序列名称.nextval;
<!--删除旧的序列-->
DROP SEQUENCE 旧序列名称;

3、创建表时直接用最新的方法创建主键id时,该序列就不能改了


字段会生成非空约束和系统序列关联,该序列不能修改,也不能跟表解绑,就是说这个ID字段就不能动了,除非删表了
同时删除非空和序列时会报错
ORACLE数据库数据id重置连续排序_第1张图片
当直接删除非空约束时
ORACLE数据库数据id重置连续排序_第2张图片
详细介绍请看:https://www.cnblogs.com/hwy425/p/4991886.html

你可能感兴趣的:(oracle,数据库)