大家可能知道MySQL有自增列(AUTO_INCREMENT),那么Oracle如何实现类似功能呢?本文将带你全面了解Oracle自增列的实现方式!
一、Oracle自增列演进史
- 12c之前版本:只能通过
序列+触发器
的方式实现 - 12c及之后版本:原生支持自增列功能,语法更简洁
二、Oracle自增列语法详解
基本语法格式:
GENERATED (ALWAYS | BY DEFAULT [ON NULL]) AS IDENTITY [sequence_options,...]
三种模式说明:
语法模式 | 说明 |
---|---|
GENERATED ALWAYS AS IDENTITY |
列永远使用序列产生的值,不允许手动指定 |
GENERATED BY DEFAULT AS IDENTITY |
列未赋值时使用序列产生的值,允许手动指定 |
GENERATED BY DEFAULT ON NULL AS IDENTITY |
列为空时使用序列产生的值,允许手动指定或置空时自动填充 |
三、三种模式实战演示
1. ALWAYS模式 – 强制使用序列值
CREATE TABLE talways (
id INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 1),
name VARCHAR2(10)
);
— 正确用法(不能指定ID值)INSERT INTO talways (name) VALUES (‘angu1’);
INSERT INTO talways (name) VALUES (‘angu2’);
— 错误用法(尝试手动指定ID)
— ORA-32795: cannot insert into a generated always identity column
INSERT INTO talways VALUES (1,‘angu’);
2. BY DEFAULT模式 – 灵活使用序列值
CREATE TABLE tdefault (
id NUMBER GENERATED BY DEFAULT AS IDENTITY,
name VARCHAR2(10)
);
— 混合插入演示INSERT INTO tdefault VALUES (1,‘angu1’); — 手动指定ID
INSERT INTO tdefault (name) VALUES (‘angu2’); — 自动生成ID
INSERT INTO tdefault VALUES (100,‘angu3’); — 手动指定大ID
INSERT INTO tdefault (name) VALUES (‘angu4’); — 自动生成ID
— 查询结果
/*
ID NAME
———- ———-
1 angu1
1 angu2
100 angu3
2 angu4
*/
3. ON NULL模式 – 智能处理NULL值
CREATE TABLE tnull (
id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
name VARCHAR2(10)
);
— 多种插入场景演示INSERT INTO tnull VALUES (1,‘angu1’); — 手动指定ID
INSERT INTO tnull (name) VALUES (‘angu2’); — 自动生成ID
INSERT INTO tnull VALUES (NULL,‘angu3’); — NULL时自动生成
INSERT INTO tnull (name) VALUES (‘angu4’); — 自动生成ID
— 查询结果
/*
ID NAME
———- ———-
1 angu1
1 angu2
2 angu3
3 angu4
*/
四、原理揭秘与性能优化
1. 底层实现机制
通过查询数据字典可以发现,自增列实际上是使用序列实现的:
-- 查看列定义
SELECT TABLE_NAME, COLUMN_NAME, DATA_DEFAULT
FROM DBA_TAB_COLUMNS
WHERE TABLE_NAME LIKE '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),高并发场景可能成为性能瓶颈。创建时可以指定优化参数:
CREATE TABLE high_perf_table (
id NUMBER GENERATED BY DEFAULT AS IDENTITY
(START WITH 100 INCREMENT BY 10 CACHE 100),
name VARCHAR2(100)
);
五、总结对比
模式 | 是否允许手动指定值 | 是否允许NULL值 | 典型使用场景 |
---|---|---|---|
ALWAYS | ❌ | ❌ | 需要严格控制的业务主键 |
BY DEFAULT | ✔️ | ❌ | 需要灵活指定的场景 |
BY DEFAULT ON NULL | ✔️ | ✔️ | 需要兼容旧数据的迁移场景 |
温馨提示:根据业务需求选择合适的模式,高并发场景记得调整CACHE大小哦!
文章来源:墨天轮,转自作者:szrsu
想了解更多干货,可通过下方扫码关注
可扫码添加上智启元官方客服微信👇