Oracle的自动增量

时间:2012-03-16 06:49:30

标签: oracle oracle11g

我需要创建一个序列和一个触发器来自动增加表上的主键,但我不知道如何操作。

7 个答案:

答案 0 :(得分:27)

创建表格和序列

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

答案 1 :(得分:21)

阅读这篇美丽的文章。

序列[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');
<{1>} 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

答案 2 :(得分:9)

试试这个:

create sequence seq_EmpID start with 1 increment by 1


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

答案 3 :(得分:0)

非常好的问题!! 可能会以这种方式使用序列 - 同样,我不确定是否确实存在差异:

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

答案 4 :(得分:0)

我不确定您使用的是哪个版本的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

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

答案 5 :(得分:0)

首先创建表:

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

答案 6 :(得分:-1)

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

示例:

-rw-r--r-- 1 root        root       238K Aug 22 17:12 geckodriver.log
-rwxrwxrwx 1 user4       user       82K  Aug 22 17:08 test.py
<1> 1lignecrÚe。

SQL> insert into emp values(masequence.nextval,'aaa');
<1> 1lignecrÚe。

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