Автоинкремент для Oracle - PullRequest
21 голосов
/ 16 марта 2012

Мне нужно создать последовательность и триггер для автоматического увеличения первичного ключа в таблице, но я не знаю, как это сделать.

Ответы [ 5 ]

27 голосов
/ 16 марта 2012

Создать таблицу и последовательность

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
21 голосов
/ 16 марта 2012

Прочитайте это, Красивая статья.

как последовательность [автоматическое увеличение в оракуле]

синтаксис

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 - это функция, которая используется для назначения столбца 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
9 голосов
/ 16 марта 2012

Попробуйте это:

create sequence seq_EmpID start with 1 increment by 1


 insert into Emp_Table values(seq_EmpID.nextval,'Ram')
0 голосов
/ 22 августа 2017

Если вы используете последовательность для нескольких таблиц, потому что значение последовательности не соответствует примеру: у нас есть две таблицы emp и зависимость: Если бы я использовал последовательность на emp, у меня было бы: ID_dept = 6, потому что 5 уже используется в другой таблице.

пример:

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

1 лигнан.

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

1 лигнан crÚÚe.

SQL> select * from emp;

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

SQL> select * from departement;

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

SQL>
0 голосов
/ 02 августа 2013

Очень хороший вопрос !! Вероятно, последовательность может быть использована таким образом - также, я не уверен, есть ли действительно разница:

CREATE SEQUENCE emp_id_seq MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...