前情提要:接上篇oracle自增序列说明,表TABLESPACETEST中使用序列更新CONTRACT_NO字段值。
原有表数据为:
1.删除数据(表数据太多了所以直接DROP了)
DROP TABLE TABLESPACETEST;
2.重新创建表TABLESPACETEST
-- Create table
create table TABLESPACETEST
(
contract_no VARCHAR2(100) not null,
contract_start_dt DATE,
contract_end_dt DATE,
loan_amt NUMBER(20,6),
loan_bal NUMBER(20,6)
)
tablespace SYSTEM
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
-- Create/Recreate primary, unique and foreign key constraints
alter table TABLESPACETEST
add constraint PK_TEST_CON primary key (CONTRACT_NO)
using index
tablespace SYSTEM
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
3.查看当前表的触发器,发现需要重新建下触发器
create trigger TRIG_TABLESPACETEST_con
before insert on TABLESPACETEST /*触发条件:当表TABLESPACETEST执行插入操作时触发此触发器*/
for each row /*对每一行都检测是否触发*/
begin
/*触发后执行的动作,在此是取得序列SEQ_SEQ_TABLESPACETEST_con的下一个值插入到表BC_ES_IK_HOT_WORD中的id字段中*/
select SEQ_TABLESPACETEST_con.nextval into :new.CONTRACT_NO from dual;
end;
4.新增表数据
发现CONTRACT_NO序列是从历史数据开始,没有从1开始。
5.新增数据达到序列的最大值报错
6.所以DROP表如果表存在序列最好重建或者使用语句回到最开始的值
原有序列现状:
6.1重建语句:
DROP SEQUENCE sequence_name;
create sequence SEQ_TABLESPACETEST_con
minvalue 1
maxvalue 999999
increment by 1
start with 1;
6.2使用语句回到最开始的
(如果不先改完新增一条数据就设置增长值改为原来的,LAST_NUMBER又会变回去。所以要先新增一条)
---数值设置为MAX_VALUE-1使得LAST_NUMBER回到1
alter sequence SEQ_TABLESPACETEST_con increment by -117128712;
----查询当前改动是否成功
select * from USER_SEQUENCES where SEQUENCE_NAME='SEQ_TABLESPACETEST_CON';
6.2.1新增一条数据
6.2.2新增一条数据成功了则还要将增长值设置回原来的
alter sequence SEQ_TABLESPACETEST_con increment by 1;
现有序列值变为: