您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

Oracle用触发器实现插入数据主键自增

2024/3/28 5:54:55发布43次查看
一篇:首先,你要有一张表! create table example( id number(4) not null primary key, name varchar(25),
一篇:首先,你要有一张表!
 create table example
(
     id number(4) not null primary key,
     name varchar(25),
     phone varchar(10),
    address varchar(50)
);
然后,你需要一个自定义的sequence 
create sequence emp_sequence
increment by 1 -- 每次加几个
start with 1 -- 从1开始计数
nomaxvalue -- 不设置最大值
nocycle -- 一直累加,,不循环
nocache -- 不建缓冲区
以上代码完成了一个序列(sequence)的建立过程,名称为emp_sequence,范围是从1开始到无限大(无限大的程度是由你机器决定的),nocycle 是决定不循环,如果你设置了最大值那么你可以用cycle 会使seq到最大之后循环.对于nocache顺便说一下如果你给出了cache值那么系统将自动读取你的cache值大小个seq,这样在反复操作时会加快运行速度,但如果遭遇意外情况如当机了或oracle死了,则下次取出的seq值将和上次的不连贯.(如果连不连贯无所谓建议用cache,因为时间就是金钱呀!跑题了!)
你只有了表和序列还不够,还需要一个触发器来执行它!代码如下:
create trigger 触发器名称 before
insert on example for each row when (new.id is null)
begin
        select emp_sequence.nextval into: new.id from dual;
end;
打完收工!下面你就试试插入数据吧!
另一篇:
学oracle不久,在建表时发现这样一个问题,比如我现在创建一个表:student
create table student
(
       id number not null,
       name varchar2(20) default '男',
       sex varchar2(4),
       address varchar2(40),
       memo varchar2(60)
)
现在我想实现每插入一条数据,就让id自动增长1.在sqlserver中这个很好实现,但在oracle中我搞了半天,查了下资料发现要用到“序列(sequence)”,“触发器”的知识。
首先,创建一个序列:
create sequence stu
minvalue 1
maxvalue 999999999999
start with 21
increment by 1
cache 20;
然后,给表student创建一个触发器:
create or replace trigger stu_tr
before insert on student
for each row
declare
-- local variables here
begin
        select stu.nextval into :new.id from dual;
end stu_tr;
*******************************************************************************************************************************
下面用一个例子来说明自增主键的创建:
1、建用户数据表
drop table dectuser;
create table dectuser(
            userid integer primary key, /*主键,自动增加*/
            name varchar2(20),
            sex varchar2(2)
);
2、创建自动增长序列
drop sequence dectuser_tb_seq;
create sequence dectuser_tb_seq
minvalue 1
maxvalue 99999999
increment by 1
start with 1; /*步长为1*/
3、创建触发器
create or replace trigger dectuser_tb_tri
before insert on dectuser   /*触发条件:当向表dectuser执行插入操作时触发此触发器*/ for each row   /*对每一行都检测是否触发*/
begin  /*触发器开始*/
        select dectuser_tb_seq.nextval into :new.userid from dual; /*触发器主题内  容,即触发后执行的动作,在此是取得序列dectuser_tb_seq的下一个值插入到表dectuser中的userid字段中*/
end; /*退出sqlplus行编辑*/
4、提交 commit;
现在就完成了自增主键的设定,搞定!可以检测一下。
insert into dectuser(name,sex) values ('wang','女');
****************************************************************************************************
总的来说,通过在insert操作之前,添加一个触发器,将序列的值放到了将要插入的数据的id中。
所以,需要 建表->建序列->建触发器 这样一个过程。
我觉得有几个要注意的
一是主键类型为 int型比较好。
二是触发器主题内容中,select...into 后面的冒号不能掉了。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product