本文已参与「新人创作礼」活动,一起开启掘金创作之路
Oracle建完表之后是没有主键自增的选项的 而这我们应该怎么处理呢 Oracle里有一个叫做序列器的东西 我们可以使用这个来进行主键自增
首先我们先建一个表并设好主键和数据库的一些属性
-- Create table
create table TABLE_NAME
(
id NUMBER not null
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 8K
minextents 1
maxextents unlimited
);
-- Add comments to the columns
comment on column TABLE_NAME.id
is '序号';
-- Create/Recreate primary, unique and foreign key constraints
alter table TABLE_NAME
add constraint TABLE_NAME_ID primary key (ID)
using index
tablespace USERS
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
然后我们再创建一个对主键进行自增的一个序列器 这段代码的意思是 创建一个名为TABLE_NAME_SEQ的序列器 最小值为1 最大值为9999999999999999999999999999 这样应该够用了 然后开始为1 每次自增加1 nocache的意思是不预先生成序列存入缓存 而cache 默认为20 可以通过而cache a(a为任意正整数) 设置预先缓存的序列值 具体的优劣 请感兴趣的读者自行查阅
-- Create sequence
create sequence TABLE_NAME_SEQ
minvalue 1
maxvalue 9999999999999999999999999999
start with 1
increment by 1
nocache;
然后我们再建立一个主键自增的触发器 这一段代码的意思为 创建一个名为TABLE_NAME_TRG的触发器 使得在插入这个表的每一行时 当id为空是 从虚表中查找下一个插入的主键值 而这里比较重要的是虚拟表这个概念 这个Dual表主要用来选择系统变量或求一个表达式的值,而Oracle有内部逻辑保证dual表中永远只有一条数据,而有同学还有疑惑这个 NEXTVAL是啥东西,其实这个NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值, 然后返回增加后的值,就是返回序列器增加过一次的值 而除了NEXTVAL 还有一个叫做CURRVAL返回当前序列的值 .
CREATE OR REPLACE TRIGGER TABLE_NAME_TRG
BEFORE INSERT ON TABLE_NAME FOR EACH ROW
WHEN(NEW.ID Is NULL)
BEGIN
SELECT TABLE_NAME_SEQ.NEXTVAL INTO :NEW.ID FROM DUAL;
END;