Oracle创建表并实现主键自增

标题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表是什么表?

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值