Oracle数据库的字段自动增长

时间:2021-12-28 23:35:20
         oracle在创建表时和其他的数据库有点不一样,如SQL SERVER可以在int类型的字段后加上identity(1,1),该字段就会从1开始,按照+1的方式自增,将这个字段设置为主键,有利于我们进行数据的插入操作。MySql中可以使用“auto_increment”即可。但是oracle有点麻烦,需要使用序列和触发器达到目的。
示例:
--1、创建表--
create table t_test(
cid number(11),
cname varchar(20),
age number(11)
)

--2、创建自动增长序列--create sequence seq_testincrement by 1start with 1nomaxvaluenominvaluenocache
--3、创建触发器--create or replace trigger trg_testbefore insert on t_testfor each rowbeginselect seq_test.nextval into :new.cid from dual;--into和new之间的冒号与into有一个空格,与new之间没空格,一定要注意--end;

    注意:笔者在写这段代码时出了一个错误,花费了很多时间在研究这个错误上,在网上查了一下,发现很多人都是遇到了和我相同的问题,后来经过研究,总算是解决了这个让很多人棘手的问题。

  这个问题是在创建触发器时总是显示“Warning: 执行完毕, 但带有警告      trigger trg_test 已编译。”,如果不理会警告继续执行下去,我们会发现数据根本就无法插入到表中。

导致这个问题的有两方面的原因,一是在触发器的脚本中,写完select语句后没有加英文分号,即select seq_test.nextval into :new.cid from dual后面没有加英文分号,二也是在触发器的脚本中,end后面没有加英文分号。两者只要有一者存在,都会导致创建触发器时弹出警告信息,这些警告信息可不像java一样可以忽略,如果忽略了警告信息,我们会发现后面根本就无法继续执行下去

对sequence说明:
  increment by :用于指定序列增量(默认值:1),如果指定的是正整数,则序列号自动递增,如果指定的是负数,则自动递减。
  start with :用于指定序列生成器生成的第一个序列号,当序列号顺序递增时默认值为序列号的最小值 当序列号顺序递减时默认值为序列号的最大值。
  Maxvalue:用于指定序列生成器可以生成的组大序列号(必须大于或等于start with,并且必须大于minvalue),默认为nomaxvalue。
  Minvalue:用于指定序列生成器可以生成的最小序列号(必须小于或等于starr with,并且必须小于maxvalue),默认值为nominvalue。
  Cycle:用于指定在达到序列的最大值或最小值之后是否继续生成序列号,默认为nocycle。
  Cache:用于指定在内存中可以预分配的序列号个数(默认值:20)。
在sequence中应注意:
  1、 第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第 一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样 的。
  2、 如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。