Oracale序列是什么?:通过一个用序列+触发器实现主键自增的实例来说明


一.Oracle序列是干嘛的?

    为表中的行自动生成唯一的序列号,从而实现主键自增;

二.为什么要在Oracle中使用序列?

    像mysql中的数据库表中的主键值都可以在创建表的时候,
    通过设置自增就能够很容易实现。
    但是oracle中没有设置自增的方法,
    解决这个情况通常就会使用序列+触发器来实现主键自增。
    创建的序列和触发器都可以在pl/sql中的squence文件夹和trigger文件夹来查看。


三.基本的SQL语句了解一下(看懂就行,实际操作不用):

  ①比如,生成一个序列生成器的模板SQL:

  //该语法用来创建一个序列生成器
CREATE SEQUENCE 序列名
  //下面是配置这个序列生成器
  INCREMENT BY n//自增间隔;正值表示递增负值表示递减
START WITH n//从多少开始,默认值是1
MAXVALUE/MINVALUE n|NOMAXVALUE(把多于的符号删了)//极限值
CYCLE|NOCYCLE//达到极限值是否循环
CACHE n| NOCACHE; //设置存放序列的内存块的大小

  ②对应的实例如下:
    
    1.创建一个序列的SQL语句:
CREATE SEQUENCE seq_newsId//不是子句
INCREMENT BY 1//一句话中的必要成分而已
START WITH 1//还加什么标点呢?
MAXVALUE 999999999;

    2.查询该序列的SQL语句:
SELECT seq_newsid.nextval
FROM sys.dual;

    3.删除该序列的SQL语句:
DROP SEQUENCE seq_newsId;

四.实际应用:实现字段主键自增:
    
    以上这些只做为理论上的了解,实际应用中,直接借助pl/sql工具来实现:
    比如实现一张表的主键自增操作步骤如下:

    1.找到Tables文件夹右键创建一个表并设置一个字段为主键,数字类型

    2.找到Squences文件夹右键新建,来新建一个sequence:S_t_person

    3.手动执行序列引用SQL语句查看序列是否让主键能够自增:

  例如:
  insert into t_person(personId,personname,personorder)values(S_t_person.Nextval,'wang',1);
  将该语句执行3次,查看personId是否有值,值是否递增;
  如果有值且自增了,就说明序列引用成功了;
  这里存在一个问题:
  问题产生的场景是,在plsql中我手动添加personname,personorder后,一提交发现personId并没有自动增加
  怎么解决这个问题呢?用触发器 怎么玩呢?看第4步

    4.直接复制粘贴下面这段SQL语句,做下修改最后执行一下就行了:
  create or replace trigger tri_test_id//创建一个触发器:tri_test_id,如果已经存在就替换掉原来的
  before insert on t_person  
  for each row //每一行
  declare
  nextid number;//声明一个number型的nextid
  begin//只要发生插入事务,就开始触发
  IF :new.personId IS NULL or :new.perosnId=0 THEN //如果该行的personId为空那么
    select S_t_person.nextval
    into nextid
    from sys.dual;//就把序列的下一个值赋值个之前创建的nextid
    :new.personId:=nextid;//然后把这个nextid再赋值给该行的personId,自然就能够在plsql中显示出来
  end if;
  end tri_test_id;//结束本次触发

猜你喜欢

转载自blog.csdn.net/weixin_42204641/article/details/82768870