在设置主键自增时有几种方法,今天介绍其中一种方法: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;
查询表结果
至此,主键自增实现。
遇到的问题
在创建触发器的时候报错 报错:权限不足显示权限不足,原因是在创建用户时,没有赋予其创建触发器的权限,来到DOS界面输入:
sqlplus /nolog
conn as sysdba // 以管理员身份登录
grant create trigger(触发器) to baobao;
赋予用户创建触发器权限
回到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开始。
网友评论