开始接触oracle,觉着非常繁琐,连主键递增都要做个序列和触发器,逐渐了解后,觉着这样的设计还是非常灵活和实用的,下面的代码有注释,应该不用再多解释了。
可以直接用no做主键,放弃id这个字段,只是一直使用id,看不到了不舒服,所以就留着了
有一个小问题就是序列和触发器的执行需要加上 ”/ “这个符号,不知道有没有和我遇到一样问题的朋友,这个应该不是问题,不过希望对喜欢自己摸索的朋友一点提示。
/**
* 目录
*/
create table tb_cate(
id number(5) primary key,
no varchar2(5) not null,
type char(1) default 0,
name varchar2(40) not null,
describe varchar2(200),
code varchar2(30) not null,
parent number(10),
lev number(1) default 0,
create_user number(10) default 0,
update_user number(10) default 0,
createtime date,
updatetiem date);
--为表tb_cate添加注释
comment on column tb_cate.id is '目录id,从1开始,每次递增1,由序列和触发器控制';
comment on column tb_cate.no is '目录编号,5位数字,高位补0,从00001开始,每次递增1,由序列和触发器控制';
comment on column tb_cate.type is '目录类型,备用,可以设置共享目录等';
comment on column tb_cate.name is '目录名称';
comment on column tb_cate.describe is '目录描述';
comment on column tb_cate.code is '目录完整编码,例如00001/00002,不包含自身';
comment on column tb_cate.parent is '上级目录';
comment on column tb_cate.lev is '目录等级,默认0级';
comment on column tb_cate.create_user is '目录创建人,默认0为系统创建';
comment on column tb_cate.update_user is '目录最后修改人,默认0为系统创建';
comment on column tb_cate.createtime is '目录创建时间';
comment on column tb_cate.updatetiem is '目录最后修改时间';
--创建tb_cate.id 的序列
create sequence tb_cate_id_seq
minvalue 1 --最小值是1
nomaxvalue --没有最大值
start with 1 --0从1开始
increment by 1 --递增1
nocycle --不循环
nocache --不建缓存区
/
--创建tb_for.id的触发过程
create or replace trigger tb_cate_id_tg
before insert on tb_cate for each row when (new.id is null)
declare v_nextval number(10);--设置变量接收序列,否则序列会递增两次
begin
v_nextval := tb_cate_id_seq.nextval;--变量赋值
select v_nextval into:new.id from dual;--设置自增id
select lpad(v_nextval,5,'0') into:new.no from dual;--设置固定位数的no值
end;
/