Oracle 的自动增量

Posted

技术标签:

【中文标题】Oracle 的自动增量【英文标题】:Auto Increment for Oracle 【发布时间】:2012-04-01 17:59:01 【问题描述】:

我需要创建一个序列和一个触发器来自动增加表上的主键,但我不知道该怎么做。

【问题讨论】:

【参考方案1】:

阅读这篇,美丽的文章。

如何排序[auto increment in oracle]

语法

Create sequence sequence_name
start with value
increment by value
minvalue value
maxvalue value;

例子

SQL> create table emp (
emp_id number(10),
fname varchar2(25),
lname varchar2(25),
constraint pk_emp_id PRIMARY KEY(emp_id)
);

SQL> Create sequence emp_sequence
start with 1
increment by 1
minvalue 1
maxvalue 10000;

SQL> insert into emp (emp_id,fname,lname) values(emp_sequence.nextval,'Darvin','Johnson');
SQL> insert into emp (emp_id,fname,lname) values(emp_sequence.nextval,'Mig','Andrews');
SQL> insert into emp (emp_id,fname,lname) values(emp_sequence.nextval,'Alex','Martin');
SQL> insert into emp (emp_id,fname,lname) values(emp_sequence.nextval,'Jon','paul');
SQL> insert into emp (emp_id,fname,lname) values(emp_sequence.nextval,'Yatin','Bones');

emp_sequence.nextval 中,emp_sequence 是我们在上面创建的序列的名称,nextval 是一个函数,用于分配 emp 表中的 next number from emp_sequence to emp_id 列。

SQL> select * from emp;

  EMP_ID FNAME                     LNAME
---------- ------------------------- -------------------------
         1 Darvin                    Johnson
         2 Mig                       Andrews
         3 Alex                      Martin
         4 Jon                       paul
         5 Yatin                     Bones

【讨论】:

谢谢,非常简洁,我可以对任何需要自动递增的表使用相同的序列吗?还有哪一部分是触发器? @JoseDavidGarciaLlanos yes 您可以根据您的要求提供适当的namemin/max values 这是使用序列,本质上与显式初始化值相同,只是依赖于值的序列。 autoincrement 是一种允许您完全忽略该字段并自动填充的策略。【参考方案2】:

创建表和序列

SQL> create table staff (
  2    emp_id number primary key,
  3    staff_name varchar2(100)
  4  );

Table created.

SQL> create sequence emp_id_seq;

Sequence created.

现在,您可以创建一个使用序列填充主键的触发器

SQL> create trigger trg_emp_id
  2    before insert on staff
  3    for each row
  4  begin
  5    select emp_id_seq.nextval
  6      into :new.emp_id
  7      from dual;
  8  end;
  9  /

Trigger created.

现在,当您插入数据时,您不需要指定 EMP_ID 列 - 它会由触发器自动填充

SQL> insert into staff( staff_name ) values ('Justin');

1 row created.

SQL> select * from staff;

    EMP_ID STAFF_NAME
---------- --------------------
         1 Justin

【讨论】:

你好,一个序列可以用于不同的表吗? @JoseDavidGarciaLlanos - 你可以,是的。通常,您将为每个表创建单独的序列。例如,这减少了在不同表上进行插入的会话之间的争用。 贾斯汀,一个快速的问题,填充表格时,是否必须再次列出属性?我只是这样做;插入工作价值观(2,“助理经理”);有什么区别? @JoseDavidGarciaLlanos:贾斯汀可能会给你一个更详细的答案,我只想说,如果你在交互模式下这样做(省略插入中的列名),即当你使用服务器直接输入并发送您的查询,您是否明确指定列取决于您。但是,如果您保存脚本以备将来使用,您可能会在几个月或几年内为您自己或其他可能维护数据库的人添加列名。 @JoseDavidGarciaLlanos:即从性能上看应该没有问题,区别更多在于维护层面。【参考方案3】:

试试这个:

create sequence seq_EmpID start with 1 increment by 1

 insert into Emp_Table values(seq_EmpID.nextval,'Ram')

【讨论】:

【参考方案4】:

非常好的问题! 可能序列可以以这种方式使用 - 另外,我不确定是否真的有区别:

CREATE SEQUENCE emp_id_seq MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10;

【讨论】:

这与另一个答案几乎相同。【参考方案5】:

如果对多个表使用一个序列,因为序列的值不一致的例子: 我们有两张桌子emp和depeartement: 如果我在 emp 上使用该序列,我会得到:ID_dept = 6,因为 5 已在另一个表中使用。

示例:

SQL> insert into emp values(masequence.nextval,'aaa');

1 法分。

SQL> insert into departement values(masequence.nextval,'aaa');

1 法分。

SQL> select * from emp;

    ID_EMP NOM_EMP
---------- -------------------------
         5 aaa

SQL> select * from departement;

   ID_DEPT NOM_DEPT
---------- ----------
         6 aaa

SQL>

【讨论】:

为不同的表分别制作序列ID,这将解决您的问题【参考方案6】:

我不确定您使用的是哪个版本的 Oracle,但以下内容适用于 19c:

create table staff (
    emp_id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
    staff_name varchar2(100)
);

https://docs.oracle.com/en/database/other-databases/nosql-database/19.3/java-driver-table/creating-tables-identity-column.html

上面的命令创建了一个系统序列,该序列自动用于填充键值。您不能删除创建的序列,因为它是系统序列,但由于在删除表和清除回收站时对列的依赖性,它会被删除。

【讨论】:

【参考方案7】:

首先创建表:

sql-> create table item(id int primary key, name varchar(25),qty int, price int);

现在我们要对第一列进行自动递增序列,即id

sql-> CREATE SEQUENCE id MINVALUE 1 START WITH 1 CACHE 10; //system saves the last 10 items in temp memory

这将创建自动增量。

现在我们正在插入数据:

sql-> insert into item VALUES(id.nextval,'ddcd',2,4);


sql-> insert into item VALUES(id.nextval,'ddcd',676,4);

终于显示表格了:

SQL> select * from item;

    ID NAME                             QTY      PRICE

     1 ddcd                               2          4
     2 ddcd                             676          4

【讨论】:

以上是关于Oracle 的自动增量的主要内容,如果未能解决你的问题,请参考以下文章

Oracle自动增量[重复]

在 Oracle 中定义自动增量时插入触发器的行为

Oracle 自动增量触发器问题

用于Java开发人员的Oracle数据库中的自动增量

在 oracle 10g 中添加自动增量和自动减量列

Oracle - 如何使用 varchar 类型创建自动增量列?