Oracle主键自增

在设置主键自增时有几种方法,今天介绍其中一种方法:sequence+trigger

1.创建表
create table tbl_card         --创建校园卡表
(
id int primary key,           --序号
card_num varchar2(20),        --校园卡号
card_holder varchar2(10),     --持卡人姓名
card_balance number           --校园卡余额
);
2.创建序列
create sequence cardID_seq --创建校园卡ID序列
start with 1               --序列从1开始
increment by 1             --每次增加1
minvalue 1                 --最小值为1
nomaxvalue                 --不设最大值
nocache                    --没有缓存
nocycle                    --一直累加不循环
3.创建触发器
create or replace trigger cardID_trigger   --创建校园卡ID触发器
before insert on tbl_card                  --在插入表之前
for each row                               --对于每一列
begin                                      --要做的操作
    select cardID_seq.nextval into :new.id from dual; --将下一个ID序列插入作为新的序号
end;
4.输入数据测试
insert into tbl_card (card_num,card_holder,card_balance)
values (1102015001,'翠花',75);
insert into tbl_card (card_num,card_holder,card_balance)
values (1102015002,'如花',122);
insert into tbl_card (card_num,card_holder,card_balance)
values (1102015003,'花花',46);
select * from tbl_card;
Oracle主键自增_第1张图片
查询表结果

至此,主键自增实现。

遇到的问题

在创建触发器的时候报错
Oracle主键自增_第2张图片
报错:权限不足

显示权限不足,原因是在创建用户时,没有赋予其创建触发器的权限,来到DOS界面输入:

sqlplus /nolog
conn as sysdba // 以管理员身份登录
grant create trigger(触发器) to baobao;
Oracle主键自增_第3张图片
赋予用户创建触发器权限

回到Oracle再次执行就OK啦

相关概念
触发器(trigger)是一些过程,当发生一个特定的数据库事件时就执行这些过程,可以使用触发器扩充引用的完整性。

DML即数据操纵语言,用于让用户或程序员使用,实现对数据库中数据的操作。基本的数据操作分成两类四种:检索(查询)和更新(插入、删除、修改)。
DML触发器即由DML语句激发,其触发事件包括insert(插入)、update(更新)和delete(删除)。无论哪种触发事件,都能为每种触发事件创建before触发器和after触发器。如可以在表上建立一个before insert 语句,表示在insert事件发生之前采取行动。

cache缓存

如果指定cache值,Oracle就可以预先在内存里面放置一些Sequence,这样存取的快些。cache里面的取完后,Oracle自动再取一组到cache。使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的Sequence就会丢失。举个例子:比如你的sequence中cache 100,那当你sequence取到90时突然断电,那么在你重启数据库后,sequence的值将从101开始。

最后,还有另一种方法可以设置自增,以后讲到。
Oracle主键自增_第4张图片
学以致用

你可能感兴趣的:(Oracle主键自增)