codememo

Oracle 자동 증분

tipmemo 2023. 7. 2. 20:46
반응형

Oracle 자동 증분

테이블의 기본 키를 자동으로 증가시키기 위해 시퀀스와 트리거를 만들어야 하는데 어떻게 하는지 모르겠습니다.

테이블과 시퀀스를 만듭니다.

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 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빈 테이블의 열입니다.

SQL> select * from emp;

  EMP_ID FNAME                     LNAME
---------- ------------------------- -------------------------
         1 Darvin                    Johnson
         2 Mig                       Andrews
         3 Alex                      Martin
         4 Jon                       paul
         5 Yatin                     Bones

사용해 보십시오.

create sequence seq_EmpID start with 1 increment by 1


 insert into Emp_Table values(seq_EmpID.nextval,'Ram')

사용 중인 Oracle 버전이 무엇인지 잘 모르겠지만 19c에서 다음과 같이 작동할 것입니다.

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

https://docs.oracle.com/en/database/other-databases/nosql-database/19.3/java-driver-table/creating-tables-identity-column.html

위의 명령은 키 값을 채우는 데 자동으로 사용되는 시스템 시퀀스를 만듭니다.생성된 시퀀스는 시스템 시퀀스이므로 삭제할 수 없지만 테이블이 삭제되고 휴지통이 제거될 때 열에 종속되기 때문에 삭제할 수 있습니다.

아주 좋은 질문입니다!!아마도 시퀀스는 이러한 방식으로 사용될 수 있습니다. 또한 실제로 차이가 있는지도 잘 모르겠습니다.

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

테이블을 처음 만드는 중:

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

시퀀스 값이 일치하지 않기 때문에 시퀀스를 여러 테이블에 사용하는 경우: 두 개의 테이블이 emp 및 department: 만약 내가 emp에 시퀀스를 사용한다면, ID_dept = 6은 다른 테이블에서 이미 사용되고 있기 때문입니다.

예:

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

1 줄 바꿈 CRUUE.

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

1 줄 바꿈 CRUUE.

SQL> select * from emp;

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

SQL> select * from departement;

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

SQL>

언급URL : https://stackoverflow.com/questions/9733085/auto-increment-for-oracle

반응형