我需要创建一个序列和一个触发器来自动增加表上的主键,但我不知道如何操作。
答案 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)
阅读这篇美丽的文章。
语法
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)
);
上面的命令创建一个系统序列,该序列将自动用于填充键值。您不能删除创建的序列,因为它是系统序列,但是由于删除表并清除回收站时其对列的依赖性。
答案 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');