【发布时间】:2012-04-01 17:59:01
【问题描述】:
我需要创建一个序列和一个触发器来自动增加表上的主键,但我不知道该怎么做。
【问题讨论】:
我需要创建一个序列和一个触发器来自动增加表上的主键,但我不知道该怎么做。
【问题讨论】:
阅读这篇,美丽的文章。
如何排序[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
【讨论】:
yes 您可以根据您的要求提供适当的name 和min/max values。
创建表和序列
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
【讨论】:
试试这个:
create sequence seq_EmpID start with 1 increment by 1
insert into Emp_Table values(seq_EmpID.nextval,'Ram')
【讨论】:
非常好的问题! 可能序列可以以这种方式使用 - 另外,我不确定是否真的有区别:
CREATE SEQUENCE emp_id_seq MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10;
【讨论】:
如果对多个表使用一个序列,因为序列的值不一致的例子: 我们有两张桌子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>
【讨论】:
我不确定您使用的是哪个版本的 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);
现在我们要对第一列进行自动递增序列,即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
【讨论】: