Oracle自增列, 12c及以上版本支持

 Oracle中自增列可以用序列或触发器实现, 在12c版本中加入了专门的自增列功能,

看看语法:

 可以看出, 语法跟序列完全一样, 其底层用的还是序列。

name列上有唯一约束, 待会儿会用到。

-- 最简单写法:
create table AUTO_INCREMENT_TABLE (
id number(4) generated as identity,
name varchar2(20) unique);

-- 把上面的建表语句写的稍微详细一点:
create table AUTO_INCREMENT_TABLE (
id number(4) generated as identity start with 1 increment by 1 nomaxvalue nocycle cache 20,
name varchar2(20) unique);

插入几条数据看看:

INSERT INTO AUTO_INCREMENT_TABLE(NAME) VALUES('BUG');
INSERT INTO AUTO_INCREMENT_TABLE(NAME) VALUES('TOM');
INSERT INTO AUTO_INCREMENT_TABLE(NAME) VALUES('Jerry');
COMMIT;
SELECT * FROM AUTO_INCREMENT_TABLE;

 可见, ID列在自动增长。

 注意事项:

一定要保证SQL语句没有语义错误, 且尽量不要rollbacktruncate否则会出现这样的情况:

当有语义错误:

-- 会报错, 违反唯一约束
INSERT INTO AUTO_INCREMENT_TABLE(NAME) VALUES('TOM');

-- 
INSERT INTO AUTO_INCREMENT_TABLE(NAME) VALUES('哪吒');
COMMIT;

select * from AUTO_INCREMENT_TABLE;

SQL语句在执行时会先读取序列的值(序列的值就变了), 然后再去检查是否违反约束挑件。

当rollback:

INSERT INTO AUTO_INCREMENT_TABLE(NAME) VALUES('熊二');

INSERT INTO AUTO_INCREMENT_TABLE(NAME) VALUES('喜羊羊');

rollback;

INSERT INTO AUTO_INCREMENT_TABLE(NAME) VALUES('熊二');

commit;

select * from AUTO_INCREMENT_TABLE;

 表可以回滚, 而序列压根儿就没有 "回滚" 这个概念的。

当truncate

truncate table AUTO_INCREMENT_TABLE;

INSERT INTO AUTO_INCREMENT_TABLE(NAME) VALUES('熊二');

commit;

select * from AUTO_INCREMENT_TABLE;

 表被清空了, 序列的值可不会回到初始值。

查看自增列详情:

自增列是一个单独的对象,是个序列,可以这样查看详情:

select * from USER_TAB_IDENTITY_COLS;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值