标题Oracle表ID自增
首先创建一张表 user
CREATE TABLE user (
id NUMBER(10) PRIMARY KEY,
uname VARCHAR2(50) NOT NULL,
pwd VARCHAR2(32),
tel VARCHAR2(11),
email VARCHAR2(50)
);
创建序列
CREATE SEQUENCE user_seq
INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOCYCLE
NOCACHE;
INCREMENT BY 1 每次增加几
START WITH 1 从1开始
NOMAXVALUE 不设置最大值
NOCYCLE 累加不循环
CACHE n / NOCACHE 缓冲区,其中n代表一个整数,默认值为20,NOCACHE就是代表不建缓冲区
如果设置了缓冲区,在主流的关系型数据库中就可以预先在内存里面放置一些SEQUENCE,来加快存取速度。简单来说,缓冲(或者缓存)里没有数据,那么它会先去数据库里找最大值,读取出来后再+1,从磁盘的读取速度要比从内存中读取慢很多了。但如果设置了缓冲,里面的取完后,Oracle自动再取一组到缓冲区中。看到这里有人就会想问为什么要不设置缓冲区。原因是 因为,使用缓冲区或许会跳号, 比如数据库突然不正常down掉,而之前缓冲区从序列里那出来的数据在序列里已经存在了,而重启数据库后缓冲区的数据就丢失了,Oracle再重新从数据库中拿最大值,但前面的就空掉了,举个例子,你去小卖部买雪糕,先记账不给钱,你买了10根,放到冰箱里,但家里停电了,雪糕全化掉,你决定去小卖部再买10根,老板计数就从11开始了,虽然你一根都没吃,但对于老板来说,视为你已经吃了。
到这里其实就已经可以实现自增了,SQL语句是
INSERT INTO user(
id,
uname,
pwd,
tel,
email
)
VALUES(
user_seq.nextval,
'test',
'123456',
'13801231234',
'test@xxx.com'
);
user_seq.nextval从序列里那到自增的值
创建触发器
CREATE TRIGGER user_seq
BEFORE INSERT ON user
FOR EACH ROW
WHEN (new.id IS Null)
BEGIN
SELECT user_seq.nextval INTO:new.id FROM sys.dual;
END;
BEFORE:表示在数据库动作之前触发器执行;
INSERT :数据库插入会触发此触发器;
FOR EACH ROW:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。
WHEN (new.id IS Null)
BEGIN
SELECT user_seq.nextval INTO:new.id FROM sys.dual;
END;
上边这一段就是条件,新的数据id是空的,就去序列里找到下一个值放到新的数据id里
下面这句SQL和上面的区别就是,不用管id列,通过触发器(insert)他自己去找到数据填充进去了
INSERT INTO user(
uname,
pwd,
tel,
email
)
VALUES(
'test',
'123456',
'13801231234',
'test@xxx.com'
);
sys.dual是一个表,这里不详细介绍了,想看的朋友移步oracle数据库里dual表是什么表?