一. Oracle数据库中创建序列
序列(sequence)就是所谓的序列号,每次取的时候它会自动增加。
创建序列的基本语法为:
create sequence My_First_Sequence
start with 起始值(默认为1)
increment by 间隔数(每次加多少,如果省略,则默认为1)
maxvalue 最大值
minvalue 最小值
nocycle --一直累加,不会循环
nocache ;--不用缓存
Oracle不像mysql一样可以创建自增的主键ID,所在在需要某一字段或者是主键自增的时候,我们就需要在Oracle中创建序列,一般创建的序列名都是SEQ_TableName这样命名的。
-- Create sequence
create sequence SEQ_TableName
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
cache 20;
其中minvalue表示最小值,maxvalue表示最大值,increment by表示步增,cache的话表示缓存。一般startwith就是从最小值开始的,当然也可以不一样。
创建的序列后,还需要创建触发器来使序列生效。
-- 建立触发器
create trigger "simon_trigger" before
insert on table_name for each row
begin
select SEQ_TableName.nextval into:new.id from dual;
end;
这个触发器表示在向table_name中插入新数据时,会先在序列中获取下一个值,然后赋值给新数据的id。
然后在代码中就不需要关注这个ID了,它会自增并且插入。
那如果想生成字符串类型的字母加数字自增应该怎么办呢?
比如说"A0001","A0002"
那么就先创建一个自增序列,然后在调用触发器的时候稍做该表即可
语句如下:
-- 建立触发器
create trigger "simon_trigger" before
insert on table_name for each row
begin
select 'A'||SEQ_TableName.nextval into:new.id from dual;
end;
二. oracle触发器写法
create or replace trigger t_after_table --create or replace trigger 触发器名称
after insert ---时间 after/before 事件 insert or update or delete
on student ---作用的表 on tablename
FOR EACH ROW -- 指定是否对受影响的每行都执行触发器,即行级触发器,如果不使用此子句,则为语句级触发器
declare --trigger 的主题
begin
insert into student_state(SSID,Ssstate) values(:NEW.SID,:NEW.SID);
end;
注释:
- before和after:指在事件发生之前或之后激活触发器。
- instead of:如果使用此子句,表示可以执行触发器代码来代替导致触发器调用的事件。
- insert、delete和update:指定构成触发器事件的数据操纵类型,update还可以制定列的列表。
- referencing:指定新行(即将更新)和旧行(更新前)的其他名称,默认为new和old。
- table_or_view_name:指要创建触发器的表或视图的名称。
- for each row:指定是否对受影响的每行都执行触发器,即行级触发器,如果不使用此子句,则为语句级触发器。
- when:限制执行触发器的条件,该条件可以包括新旧数据值得检查。
- declare---end:是一个标准的PL/SQL块。
网友评论