Oracle的自动增量

Oracle的自动增量,oracle,oracle11g,Oracle,Oracle11g,我需要创建一个序列和一个触发器来自动增加表上的主键,但我不知道如何做。阅读这篇漂亮的文章 如何排序 语法 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

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

阅读这篇漂亮的文章

如何排序

语法

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_序列中。nextval
其中
emp_序列
是我们在上面创建的序列名称,
nextval
是一个函数,用于将emp_序列中的
下一个数字分配给emp表中的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

创建表和序列

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\u ID
列——它将由触发器自动填充

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

1 row created.

SQL> select * from staff;

    EMP_ID STAFF_NAME
---------- --------------------
         1 Justin
试试这个:

create sequence seq_EmpID start with 1 increment by 1

很好的问题!! 可能序列可以这样使用-而且,我不确定是否真的有区别:

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

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

例如:

SQL> insert into emp values(masequence.nextval,'aaa');
1木质素

SQL> insert into departement values(masequence.nextval,'aaa');
SQL> select * from emp;

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

SQL> select * from departement;

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

SQL>
1木质素

SQL> insert into departement values(masequence.nextval,'aaa');
SQL> select * from emp;

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

SQL> select * from departement;

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

SQL>

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

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


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

首先创建表:

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

    ID NAME                             QTY      PRICE
现在我们要对第一列进行自动递增序列,即
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-> create table item(id int primary key, name varchar(25),qty int, price int);
SQL> select * from item;

    ID NAME                             QTY      PRICE


谢谢,非常整洁,我可以对任何需要自动递增的表使用相同的序列吗?还有,触发器是哪一部分?@JoseDavidGarciaLlanos
yes
您可以根据您的要求给出适当的
名称
min/max值
。这是使用一个序列,本质上与显式初始化值相同,只是依赖于值的序列。自动增量是一种允许您完全忽略字段并自动填充的策略。您好,序列可以用于不同的表吗?@JoseDavidGarciaLlanos-您可以,是的。按照惯例,您会为每个表创建单独的序列。例如,这减少了在不同表上执行插入操作的会话之间的争用。Justin,一个简单的问题是,在填充表时,是否必须再次列出属性?我只是喜欢这样做;在职务值中插入(2,“助理经理”);有什么区别?@JoseDavidGarciaLlanos:Justin可能会给你一个更详细的答案,我只想说,如果你在交互模式下这样做(在插入中省略列名),也就是说,当你使用服务器直接输入和发送查询时,你是否明确指定列取决于你自己。但是,如果您保存脚本以备将来使用,您可能会在几个月或几年内帮自己或其他任何人维护数据库,将列名放入其中。@JoseDavidGarciaLlanos:也就是说,从性能角度来看,应该没有问题,不同之处在于维护平面。这与另一个答案几乎相同。分别为不同的表创建序列id,这将解决您的问题