暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle - 设置自增列

原创 杨豹 2024-09-28
251

一、概述

在mysql中,创建表时可以使用auto_increment来指定一个列为自增列,那么oracle中怎么实现呢?

二、实验

在oracle中实现自增列可以有三种方法,以下分别介绍

1. 通过序列的方式

create sequence seq_test;
create table test1(id number default seq_test.nextval primary key, name varchar2(100));

该方法先创建一个序列,然后在创建表时,指定该序列的下一个值作为默认值。即使用 insert into test1(name) values(‘xx’)进行插入时,id的值就自动增加了。
这里有两点需要注意,一是如果显示的插入了一个id值,举例:使用insert into test1(id,name) values(5,‘xx’),当后面再使用不带id的insert语句时,如果序列的值增加到5,会报唯一性冲突。
第二点需要注意的是,即使insert语句插入失败,但是这个序列值依然会增加,因为序列的nextval已经执行了,只是后面的insert违反主键约束而已。

2. 通过生成列的方式

create table test2(id number generated as identity primary key, name varchar2(100));

这种方式并不需要手工创建序列,在insert into test2(name) values(‘xxx’)的时候,id的值会自增。那么这是一个什么原理呢,其实是数据库后台自动生成了一个自增序列,通过select * from user_sequences可以看到有一个ISEQ$$_138136的序列,这就是系统自动生成的。
这种方式需要注意的一点就是在insert的时候不能使用insert into test2(id,name) values(5,‘xx’)的方式,数据库后台会报ORA-32795: 无法插入到始终生成列。也就是说生成的列不能写在insert语句中,只能系统自动生成。

3. 通过触发器的方式

create table test3(id number primary key, name varchar2(100));
create sequence seq_test3;

create trigger t before insert on test3
for each row
  begin
    :new.id := seq_test3.nextval;
  end;
  /

注意通过此种方式,使用insert into(id,name) values(5,‘a’),5在插进去之前就被替换成了seq_test3.nextval,所以id带不带插入的结果都一样。
触发器的方式是最不优雅的,而且效率最低。

最后修改时间:2024-09-29 11:14:28
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论