Oracle主键自增的实现方法

作者:技术拾光

时间:2026-06-13

浏览:239

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

文章目录
在 Oracle 数据库中,想要让主键字段实现自动递增,这其实是很多从 MySQL 或 SQL Server 转过来的开发者经常会问的问题。毕竟,Oracle 并没有像其他数据库那样的“自增列”关键字,但这并不意味着我们做不到。下面就来拆解几种主流做法,供大家参考。

Oracle主键自增的实现方法

很多人第一反应是:Oracle 没有自增?那怎么保证主键唯一又不重复呢?其实,通过序列(Sequence)加触发器(Trigger)的方式完全能搞定,而且非常灵活。另外,如果你用的是 Oracle 12c 及以上版本,还有更简洁的 IDENTITY 列可以用。下面逐一说明。

一、使用序列(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,这样当插入时显式提供了主键值,就用提供的值;否则由系统自动生成。

总结

两种方法各有适用场景:序列加触发器是“万能钥匙”,任何版本都能用,但需要多写两行代码;IDENTITY 列则更简洁,只需要在表定义里加一句话,但要求数据库版本在 12c 及以上。 选择哪一种,主要看你当前的数据库版本和团队习惯。如果项目已经用了 12c 以上,建议优先考虑 IDENTITY 列,因为它更符合现代 SQL 标准,也更容易维护。如果还在用老版本,那就用序列加触发器,同样稳定可靠。 最后强调一点:无论采用哪种方式,主键字段的自增都能保证数据的唯一性,同时简化插入操作。希望这篇文章能帮你理清思路,在实际项目中做出合适的选择。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章