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

2014-11-24 18:07:08 · 作者: · 浏览: 0

一篇:首先,你要有一张表!


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 -- 不建缓冲区


你只有了表和序列还不够,还需要一个触发器来执行它!代码如下:


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 后面的冒号不能掉了。