Автоматическое увеличение для Oracle
Мне нужно создать последовательность и триггер для автоматического увеличения первичного ключа в таблице, но я не знаю, как это сделать.
Ответы
Ответ 1
Создайте таблицу и последовательность
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
Ответ 2
Прочтите это, красивая статья.
как последовательность [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');
in emp_sequence.nextval
где emp_sequence
- это имя последовательности, которую мы создали выше, а nextval
- это функция, которая используется для назначения столбца next number from emp_sequence to emp_id
в таблице emp.
SQL> select * from emp;
EMP_ID FNAME LNAME
---------- ------------------------- -------------------------
1 Darvin Johnson
2 Mig Andrews
3 Alex Martin
4 Jon paul
5 Yatin Bones
Ответ 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 ligne crÚÚe.
SQL> insert into departement values(masequence.nextval,'aaa');
1 ligne crÚÚe.
SQL> select * from emp;
ID_EMP NOM_EMP
---------- -------------------------
5 aaa
SQL> select * from departement;
ID_DEPT NOM_DEPT
---------- ----------
6 aaa
SQL>