大家可能知道MySQL有自增列(AUTO_INCREMENT),那么Oracle如何实现类似功能呢?本文将带你全面了解Oracle自增列的实现方式!
一、Oracle自增列演进史
12c之前版本:只能通过
序列+触发器的方式实现12c及之后版本:原生支持自增列功能,语法更简洁
二、Oracle自增列语法详解
基本语法格式:
GENERATED(ALWAYS|BYDEFAULT[ONNULL])AS IDENTITY [sequence_options,...]
三种模式说明:
| 语法模式 | 说明 |
|---|---|
GENERATED ALWAYS AS IDENTITY |
列永远使用序列产生的值,不允许手动指定 |
GENERATED BY DEFAULT AS IDENTITY |
列未赋值时使用序列产生的值,允许手动指定 |
GENERATED BY DEFAULT ON NULL AS IDENTITY |
列为空时使用序列产生的值,允许手动指定或置空时自动填充 |
三、三种模式实战演示
1. ALWAYS模式 - 强制使用序列值
CREATETABLE talways (
id INTEGERGENERATEDALWAYSAS IDENTITY (STARTWITH1),
name VARCHAR2(10)
);
-- 正确用法(不能指定ID值)
INSERTINTO talways (name)VALUES('angu1');
INSERTINTO talways (name)VALUES('angu2');
-- 错误用法(尝试手动指定ID)
-- ORA-32795: cannot insert into a generated always identity column
INSERTINTO talways VALUES(1,'angu');
2. BY DEFAULT模式 - 灵活使用序列值
CREATETABLE tdefault (
id NUMBER GENERATEDBYDEFAULTAS IDENTITY,
name VARCHAR2(10)
);
-- 混合插入演示
INSERTINTO tdefault VALUES(1,'angu1'); -- 手动指定ID
INSERTINTO tdefault (name)VALUES('angu2');-- 自动生成ID
INSERTINTO tdefault VALUES(100,'angu3'); -- 手动指定大ID
INSERTINTO tdefault (name)VALUES('angu4');-- 自动生成ID
-- 查询结果
/*
ID NAME
---------- ----------
1 angu1
1 angu2
100 angu3
2 angu4
*/
3. ON NULL模式 - 智能处理NULL值
CREATETABLE tnull (
id NUMBER GENERATEDBYDEFAULTONNULLAS IDENTITY,
name VARCHAR2(10)
);
-- 多种插入场景演示
INSERTINTO tnull VALUES(1,'angu1'); -- 手动指定ID
INSERTINTO tnull (name)VALUES('angu2');-- 自动生成ID
INSERTINTO tnull VALUES(NULL,'angu3');-- NULL时自动生成
INSERTINTO tnull (name)VALUES('angu4');-- 自动生成ID
-- 查询结果
/*
ID NAME
---------- ----------
1 angu1
1 angu2
2 angu3
3 angu4
*/
四、原理揭秘与性能优化
1. 底层实现机制
通过查询数据字典可以发现,自增列实际上是使用序列实现的:
-- 查看列定义
SELECTTABLE_NAME, COLUMN_NAME, DATA_DEFAULT
FROM DBA_TAB_COLUMNS
WHERETABLE_NAMELIKE'T%'AND COLUMN_NAME='ID';
/*
TABLE_NAME COLUMN_NAME DATA_DEFAULT
--------------- ---------- ------------------------------
TALWAYS ID "SYS"."ISEQ$$_81866".nextval
TDEFAULT ID "SYS"."ISEQ$$_81870".nextval
TNULL ID "SYS"."ISEQ$$_81874".nextval
*/
-- 查看序列属性
SELECT SEQUENCE_NAME, MIN_VALUE, MAX_VALUE, INCREMENT_BY, CACHE_SIZE
FROM DBA_SEQUENCES WHERE SEQUENCE_NAME LIKE'ISEQ%';
2. 性能优化建议
默认的CACHE值较小(20),高并发场景可能成为性能瓶颈。创建时可以指定优化参数:
CREATETABLE high_perf_table (
id NUMBER GENERATEDBYDEFAULTAS IDENTITY
(STARTWITH100 INCREMENT BY10CACHE100),
name VARCHAR2(100)
);
五、总结对比
| 模式 | 是否允许手动指定值 | 是否允许NULL值 | 典型使用场景 |
|---|---|---|---|
| ALWAYS | ❌ | ❌ | 需要严格控制的业务主键 |
| BY DEFAULT | ✔️ | ❌ | 需要灵活指定的场景 |
| BY DEFAULT ON NULL | ✔️ | ✔️ | 需要兼容旧数据的迁移场景 |
温馨提示:根据业务需求选择合适的模式,高并发场景记得调整CACHE大小哦!
如果你觉得这篇文章有帮助,欢迎点赞收藏🌟,有任何Oracle问题也可以在评论区留言讨论~

