大数跨境
0
0

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

Oracle 自增列终极指南,三种用法一文打尽! 老苏畅谈运维
2025-06-17
4
导读:大家可能知道MySQL有自增列(AUTO_INCREMENT),那么Oracle如何实现类似功能呢?


大家可能知道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问题也可以在评论区留言讨论~

关注我,学习更多的数据库知识!

【声明】内容源于网络
0
0
老苏畅谈运维
1234
内容 122
粉丝 0
老苏畅谈运维 1234
总阅读772
粉丝0
内容122