一.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;//结束本次触发