Oracle创建序列后无法使用序列初始值

Oracle创建序列后无法使用序列初始值

在使用oracle数据库时,遇到了序列的一个问题,即在创建一个序列后,无法获得该序列的第一个值,如下:
  • 首先创建序列
create sequence seq_stu
start with 1
increment by 1
  • 创建表
  create table stu(
  s_id number not null primary key,
  s_name varchar2(20),
  s_age number
)
  • 当前表的数据
    select * from stu;
    Oracle创建序列后无法使用序列初始值_第1张图片
    可以看出当前表空数据为空。
  • 接下来使用第一步创建的seq_stu序列来给stu表插入一条数据
insert into stu values(seq_stu.nextval,'张三',18);
  • 再次查询stu表

在这里插入图片描述
这个时候我们会发现,S_ID的值并不是1,而是1+1,就是说得不到序列seq_stu的第一个值。

解决方法

  1. 第一种方法:在创建序列时添加minvalue属性,代码如下:
--创建序列
create sequence seq_stu_one
start with 1
increment by 1
--使用minvalue属性
minvalue 1
--插入数据
insert into stu values(seq_stu_one.nextval,'seq_stu_one',18);
--查询
select * from stu;

查询结果:
在这里插入图片描述
从结果可以看出序列已经可以从1开始了

  1. 第二种方法:写一个触发器监控该表插入时的状态
--触发器
create or replace trigger stu_id_insert
before insert on stu
for each row
declare
  row_count number;
begin
  select count(*) into row_count from stu;
  --如果表中没数据
  if row_count=0 then
   :new.s_id:=1;
  else
   :new.s_id:=seq_stu_one.nextval;
  end if;
end;
--插入
insert into stu values(null,'seq_stu_one',18);

当然这种方法有可能瑕疵,得根据自己需求写相应的触发器。

  1. 第三种方法:修改oracle数据库相关设置

    出现这样的原因是Oracle从 11.2.0.1版本开始,提供了一个“延迟段创建”特性。当我们使用序列作为插入数据时,如果使用了“延迟段”技术,则跳过序列的第一个值。
    更改登录用户为权限较高的管理员,设置:

ALTER SYSTEM SET deferred_segment_creation=FALSE;

这样就可以解决了。

你可能感兴趣的:(oracle,序列,oracle,初始值,start,with)