Oracle 自增列终极指南,三种用法一文打尽!17认证网

正规官方授权
更专业・更权威

Oracle 自增列终极指南,三种用法一文打尽!

大家可能知道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

想了解更多干货,可通过下方扫码关注

可扫码添加上智启元官方客服微信👇

未经允许不得转载:17认证网 » Oracle 自增列终极指南,三种用法一文打尽!
分享到:0

评论已关闭。

400-663-6632
咨询老师
咨询老师
咨询老师