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语句没有语义错误, 且尽量不要rollback或truncate否则会出现这样的情况:
当有语义错误:
-- 会报错, 违反唯一约束
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;