Oracle主键自增的实现方法
作者:技术拾光时间:2026-06-13 08:39:02浏览:240
在 Oracle 数据库中,想要让主键字段实现自动递增,这其实是很多从 MySQL 或 SQL Server 转过来的开发者经常会问的问题。毕竟,Oracle 并没有像其他数据库那样的“自增列”关键字,但这并不意味着我们做不到。下面就来拆解几种主流做法,供大家参考。 很多人第一反应是:Oracle
在 Oracle 数据库中,想要让主键字段实现自动递增,这其实是很多从 MySQL 或 SQL Server 转过来的开发者经常会问的问题。毕竟,Oracle 并没有像其他数据库那样的“自增列”关键字,但这并不意味着我们做不到。下面就来拆解几种主流做法,供大家参考。

一、使用序列(Sequence)和触发器(Trigger)
这是最经典、最通用的方法,适用于所有版本的 Oracle。思路很简单:先创建一个序列对象,定义好起始值、步长和最大值等参数;然后创建一个触发器,在每次插入数据之前,自动从序列里取出下一个值,赋给主键字段。 示例代码如下:-- 创建序列 CREATE SEQUENCE table_name_seq START WITH 1 INCREMENT BY 1 MAXVALUE 999999999999999999999999 NOCACHE NOCYCLE; -- 创建触发器 CREATE OR REPLACE TRIGGER table_name_trigger BEFORE INSERT ON table_name FOR EACH ROW BEGIN SELECT table_name_seq.NEXTVAL INTO :new.primary_key_column FROM DUAL; END;这段代码里,
table_name_seq 序列从 1 开始,每次递增 1,最大值设置得非常大,而且不缓存、不循环。触发器则在每一行插入前执行,把序列的下一个值塞进主键列。这样,每次插入新记录,主键就会自动增长。
二、使用 IDENTITY 列
如果你用的是 Oracle 12c 或更高的版本,那就有更简单的选择了 —— IDENTITY 列。这个特性跟 MySQL 的AUTO_INCREMENT 非常像,直接在表定义里声明就行,连序列和触发器都不用写。
示例代码如下:
CREATE TABLE table_name ( primary_key_column NUMBER GENERATED ALWAYS AS IDENTITY, -- 其他列定义... );注意这里的
GENERATED ALWAYS AS IDENTITY,它告诉 Oracle 这个列的值由系统自动生成,而且是严格自增的。插入数据时,完全不用管主键列,Oracle 会自动帮我们生成唯一的递增值。
当然,如果你希望在某些场景下可以手动指定主键值,也可以用 GENERATED BY DEFAULT AS IDENTITY,这样当插入时显式提供了主键值,就用提供的值;否则由系统自动生成。
