programing

Oracle에서 AUTO_INCREMENT로 ID를 생성하는 방법은 무엇입니까?

javamemo 2023. 7. 9. 09:31
반응형

Oracle에서 AUTO_INCREMENT로 ID를 생성하는 방법은 무엇입니까?

버전 11g까지는 Oracle에 AUTO_INCREMENT 개념이 없는 것으로 보입니다.

Oracle 11g에서 자동 증분처럼 작동하는 열을 만들려면 어떻게 해야 합니까?

Oracle 11g 기준으로 Oracle에는 "auto_increment" 또는 "identity" 열이 없습니다.그러나 시퀀스와 트리거를 사용하여 쉽게 모델링할 수 있습니다.

테이블 정의:

CREATE TABLE departments (
  ID           NUMBER(10)    NOT NULL,
  DESCRIPTION  VARCHAR2(50)  NOT NULL);

ALTER TABLE departments ADD (
  CONSTRAINT dept_pk PRIMARY KEY (ID));

CREATE SEQUENCE dept_seq START WITH 1;

트리거 정의:

CREATE OR REPLACE TRIGGER dept_bir 
BEFORE INSERT ON departments 
FOR EACH ROW

BEGIN
  SELECT dept_seq.NEXTVAL
  INTO   :new.id
  FROM   dual;
END;
/

업데이트:

IDENTITY 열은 이제 Oracle 12c에서 사용할 수 있습니다.

create table t1 (
    c1 NUMBER GENERATED by default on null as IDENTITY,
    c2 VARCHAR2(10)
    );

과 증분 을 지정하여 열에 할 수 합니다(" "ID" "는 "ID" "는 "를 의미합니다").GENERATED ALWAYS ( 해당 (Oracle 12c+만 해당)

create table t1 (
    c1 NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1),
    c2 VARCHAR2(10)
    );

또는 Oracle 12에서는 시퀀스를 기본값으로 사용할 수도 있습니다.

CREATE SEQUENCE dept_seq START WITH 1;

CREATE TABLE departments (
  ID           NUMBER(10)    DEFAULT dept_seq.nextval NOT NULL,
  DESCRIPTION  VARCHAR2(50)  NOT NULL);

ALTER TABLE departments ADD (
  CONSTRAINT dept_pk PRIMARY KEY (ID));

SYS_GUID전역적으로 고유한 ID인 GUID를 반환합니다.A는RAW(16)증분 숫자 값은 생성되지 않습니다.

증분 숫자 키를 만들려면 시퀀스를 만들어야 합니다.

CREATE SEQUENCE name_of_sequence
  START WITH 1
  INCREMENT BY 1
  CACHE 100;

여러분은 그다음해사용다니합를스퀀시당에 그 할 것입니다.INSERT

INSERT INTO name_of_table( primary_key_column, <<other columns>> )
  VALUES( name_of_sequence.nextval, <<other values>> );

또는 시퀀스를 사용하여 기본 키 값을 자동으로 채우는 트리거를 정의할 수 있습니다.

CREATE OR REPLACE TRIGGER trigger_name
  BEFORE INSERT ON table_name
  FOR EACH ROW
BEGIN
  SELECT name_of_sequence.nextval
    INTO :new.primary_key_column
    FROM dual;
END;

오라클 11.1 이상을 사용하는 경우 트리거를 약간 단순화할 수 있습니다.

CREATE OR REPLACE TRIGGER trigger_name
  BEFORE INSERT ON table_name
  FOR EACH ROW
BEGIN
  :new.primary_key_column := name_of_sequence.nextval;
END;

이 정말로 사면로려하를 사용하고 .SYS_GUID

CREATE TABLE table_name (
  primary_key_column raw(16) default sys_guid() primary key,
  <<other columns>>
)

Oracle 12c 이상에서는 다음과 같은 작업을 수행할 수 있습니다.

CREATE TABLE MAPS
(
  MAP_ID INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) NOT NULL,
  MAP_NAME VARCHAR(24) NOT NULL,
  UNIQUE (MAP_ID, MAP_NAME)
);

그리고 Oracle(12c 이전)에서.

-- create table
CREATE TABLE MAPS
(
  MAP_ID INTEGER NOT NULL ,
  MAP_NAME VARCHAR(24) NOT NULL,
  UNIQUE (MAP_ID, MAP_NAME)
);

-- create sequence
CREATE SEQUENCE MAPS_SEQ;

-- create tigger using the sequence
CREATE OR REPLACE TRIGGER MAPS_TRG 
BEFORE INSERT ON MAPS 
FOR EACH ROW
WHEN (new.MAP_ID IS NULL)
BEGIN
  SELECT MAPS_SEQ.NEXTVAL
  INTO   :new.MAP_ID
  FROM   dual;
END;
/

세 가지 맛이 있습니다.

  1. 숫자의단순 증가 숫자 값(예: 1, 2, 3, ...)
  2. GUID. 글로벌 범용 식별자로서,RAW데이터 형식
  3. GUID(문자열).위와 동일하지만 일부 언어에서는 처리하기 쉬운 문자열입니다.

x는 ID 열입니다.FOO각 예에 당신의 테이블 이름이 포함되어 있습니다.

-- numerical identity, e.g. 1,2,3...
create table FOO (
    x number primary key
);
create sequence  FOO_seq;

create or replace trigger FOO_trg
before insert on FOO
for each row
begin
  select FOO_seq.nextval into :new.x from dual;
end;
/

-- GUID identity, e.g. 7CFF0C304187716EE040488AA1F9749A
-- use the commented out lines if you prefer RAW over VARCHAR2.
create table FOO (
    x varchar(32) primary key        -- string version
    -- x raw(32) primary key         -- raw version
);

create or replace trigger FOO_trg
before insert on FOO
for each row
begin
  select cast(sys_guid() as varchar2(32)) into :new.x from dual;  -- string version
  -- select sys_guid() into :new.x from dual;                     -- raw version
end;
/

업데이트:

Oracle 12c에는 트리거에 의존하지 않는 다음과 같은 두 가지 변형이 도입되었습니다.

create table mytable(id number default mysequence.nextval);
create table mytable(id number generated as identity);

첫 번째는 전통적인 방식으로 시퀀스를 사용하고, 두 번째는 내부적으로 값을 관리합니다.

Oracle Database 12c는 자동 증분(시스템 생성) 열인 Identity를 도입했습니다.이전 데이터베이스 버전(11g까지)에서는 일반적으로 시퀀스와 트리거를 만들어 ID를 구현합니다.12c 이후부터는 자신만의 테이블을 만들고 ID로 생성해야 하는 열을 정의할 수 있습니다.

SQL Server ID 열과 같은 열을 의미한다고 가정하십니까?

Oracle에서는 SEQUENCE를 사용하여 동일한 기능을 수행합니다.제가 좋은 링크를 찾아서 여기에 올릴 수 있는지 알아보겠습니다.

업데이트: 직접 찾은 것 같습니다.어쨌든 여기 링크가 있습니다: http://www.techonthenet.com/oracle/sequences.php

Trigger그리고.Sequence누구나 쉽게 읽을 수 있는 일련 번호를 원할 때 사용할 수 있습니다.Column(같은)을관리하고 않고 이 의 값이 하지 않은 에는 emp_id ID 열 (emp_id 등) 을그관 않러중 않지 그있다 하요수 다다니사 면습음 할을용나 값리지이를 사용할 수 .SYS_GUID()자동 증분을 가져오려면 테이블 만들기에서 다음과 같이 입력합니다.

CREATE TABLE <table_name> 
(emp_id RAW(16) DEFAULT SYS_GUID() PRIMARY KEY,
name VARCHAR2(30));

이제 당신의emp_id할 수 .이렇게 emp_id 열을 무시하면 테이블에 값을 삽입할 수 있습니다.

INSERT INTO <table_name> (name) VALUES ('name value');

그래서, 그것은 당신의 고유한 가치를 삽입할 것입니다.emp_id기둥.

Oracle 12c부터는 다음 두 가지 방법 중 하나로 Identity 열을 지원합니다.

  1. 시퀀스 + - 이 솔루션에서는 일반적인 방식으로 시퀀스를 생성한 다음 다음 DDL을 사용합니다.

    CREATE TABLE MyTable(ID NUMBER DEFAULT MyTable_Seq).다음 값, ...)

  2. 만 - 이 솔루션에서는 시퀀스가 명시적으로 지정되지 않았습니다.다음 DDL을 사용합니다.

    CREATE TABLE MyTable(ID 번호가 ID로 생성됨, ...)

첫 번째 방법을 사용하면 기존 방식과 역호환됩니다.두 번째는 조금 더 단순하고 다른 RDMS 시스템과 더 일치합니다.

은 고라합니다라고 불립니다.Identity ColumnsOracle 12c에서만 사용할 수 있습니다.

CREATE TABLE identity_test_tab
(
   id            NUMBER GENERATED ALWAYS AS IDENTITY,
   description   VARCHAR2 (30)
);

Identity Columns하기와 같이

INSERT INTO identity_test_tab (description) VALUES ('Just DESCRIPTION');

하나의 행이 생성되었습니다.

아래와 같이 삽입할 수 없습니다.

INSERT INTO identity_test_tab (id, description) VALUES (NULL, 'ID=NULL and DESCRIPTION');

줄 1의 오류: ORA-32795: 생성된 항상 ID 열에 삽입할 수 없습니다.

INSERT INTO identity_test_tab (id, description) VALUES (999, 'ID=999 and DESCRIPTION');

줄 1의 오류: ORA-32795: 생성된 항상 ID 열에 삽입할 수 없습니다.

유용한 링크

다음은 자동 증분에 대한 완전한 솔루션 w.r.t 예외/오류 처리입니다. 이 솔루션은 하위 호환성이 있으며, 특히 애플리케이션이 운영 중인 경우 11g 및 12c에서 작동합니다.

'TABLE_NAME'을(를) 적절한 테이블 이름으로 바꾸십시오.

--checking if table already exisits
BEGIN
    EXECUTE IMMEDIATE 'DROP TABLE TABLE_NAME';
    EXCEPTION WHEN OTHERS THEN NULL;
END;
/

--creating table
CREATE TABLE TABLE_NAME (
       ID NUMBER(10) PRIMARY KEY NOT NULL,
       .
       .
       .
);

--checking if sequence already exists
BEGIN
    EXECUTE IMMEDIATE 'DROP SEQUENCE TABLE_NAME_SEQ';
    EXCEPTION WHEN OTHERS THEN NULL;
END;

--creating sequence
/
CREATE SEQUENCE TABLE_NAME_SEQ START WITH 1 INCREMENT BY 1 MINVALUE 1 NOMAXVALUE NOCYCLE CACHE 2;

--granting rights as per required user group
/
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE_NAME TO USER_GROUP;

-- creating trigger
/
CREATE OR REPLACE TRIGGER TABLE_NAME_TS BEFORE INSERT OR UPDATE ON TABLE_NAME FOR EACH ROW
BEGIN    
    -- auto increment column
    SELECT TABLE_NAME_SEQ.NextVal INTO :New.ID FROM dual;

    -- You can also put some other required default data as per need of your columns, for example
    SELECT SYS_CONTEXT('USERENV', 'SESSIONID') INTO :New.SessionID FROM dual;
    SELECT SYS_CONTEXT('USERENV','SERVER_HOST') INTO :New.HostName FROM dual;
    SELECT SYS_CONTEXT('USERENV','OS_USER') INTO :New.LoginID FROM dual;    
    .
    .
    .
END;
/

오라클에서 자동 증분을 만들기 위한 쿼리입니다.아래 쿼리에서는 새 행을 삽입할 때마다 incrmnt 열 값이 자동으로 증가합니다.

CREATE TABLE table1(
id RAW(16) NOT NULL ENABLE,
incrmnt NUMBER(10,0) GENERATED ALWAYS AS IDENTITY
MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 NOORDER NOCYCLE NOT NULL ENABLE,
CONSTRAINT PK_table1 PRIMARY KEY (id) ENABLE);

기존 테이블 및 열(ID 이름)에서 수행한 작업은 다음과 같습니다.

UPDATE table SET id=ROWNUM;
DECLARE
  maxval NUMBER;
BEGIN
  SELECT MAX(id) INTO maxval FROM table;
  EXECUTE IMMEDIATE 'DROP SEQUENCE table_seq';
  EXECUTE IMMEDIATE 'CREATE SEQUENCE table_seq START WITH '|| TO_CHAR(TO_NUMBER(maxval)+1) ||' INCREMENT BY 1 NOMAXVALUE';
END;
CREATE TRIGGER table_trigger
  BEFORE INSERT ON table
  FOR EACH ROW
BEGIN
  :new.id := table_seq.NEXTVAL;
END;
FUNCTION GETUNIQUEID_2 RETURN VARCHAR2
AS
v_curr_id NUMBER;
v_inc NUMBER;
v_next_val NUMBER;
pragma autonomous_transaction;
begin 
CREATE SEQUENCE sequnce
START WITH YYMMDD0000000001
INCREMENT BY 1
NOCACHE
select sequence.nextval into v_curr_id from dual;
if(substr(v_curr_id,0,6)= to_char(sysdate,'yymmdd')) then
v_next_val := to_number(to_char(SYSDATE+1, 'yymmdd') || '0000000000');
v_inc := v_next_val - v_curr_id;
execute immediate ' alter sequence sequence increment by ' || v_inc ;
select sequence.nextval into v_curr_id from dual;
execute immediate ' alter sequence sequence increment by 1';
else
dbms_output.put_line('exception : file not found');
end if;
RETURN 'ID'||v_curr_id;
END;
FUNCTION UNIQUE2(
 seq IN NUMBER
) RETURN VARCHAR2
AS
 i NUMBER := seq;
 s VARCHAR2(9);
 r NUMBER(2,0);
BEGIN
  WHILE i > 0 LOOP
    r := MOD( i, 36 );
    i := ( i - r ) / 36;
    IF ( r < 10 ) THEN
      s := TO_CHAR(r) || s;
    ELSE
      s := CHR( 55 + r ) || s;
    END IF;
  END LOOP;
  RETURN 'ID'||LPAD( s, 14, '0' );
END;

시퀀스 만들기:

CREATE SEQUENCE SEQ_CM_LC_FINAL_STATUS
MINVALUE 1 MAXVALUE 999999999999999999999999999 
INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE;

트리거 추가

CREATE OR REPLACE TRIGGER CM_LC_FINAL_STATUS_TRIGGER
BEFORE INSERT
ON CM_LC_FINAL_STATUS
FOR EACH ROW
BEGIN
:NEW.LC_FINAL_STATUS_NO := SEQ_CM_LC_FINAL_STATUS.NEXTVAL;
END;

첫 번째 단계는 여러 사용자가 자동으로 증분 값을 생성하기 위해 액세스할 수 있는 데이터 개체인 SEQUENCE를 데이터베이스에 만드는 것입니다.설명서에서 설명한 것처럼 Oracle의 시퀀스는 여러 사용자가 각 순차적 항목을 생성하기 전에 "순서대로" 작업을 수행해야 하므로 중복 값이 동시에 생성되는 것을 방지합니다.

마지막으로, 나중에 고유한 자동 증분 값을 생성하는 데 사용할 Sequence를 만들 것입니다.

우리가 테이블을 만들고 준비하는 동안, 우리의 순서는 지금까지 그냥 앉아 있을 뿐 결코 사용되지 않습니다.여기서 트리거가 발생합니다.현대 프로그래밍 언어의 이벤트와 유사하게 Oracle의 트리거는 특정 이벤트가 발생할 때 실행되는 저장 프로시저입니다.일반적으로 테이블이 업데이트되거나 레코드가 삭제될 때 트리거가 작동하도록 구성되어 필요할 때 약간의 정리 기능을 제공합니다.

우리의 경우 CM_LC_FINAL_STATUS 테이블에 삽입하기 전에 트리거를 실행하여 시퀀스가 증가하고 새 값이 기본 키 열에 전달되도록 합니다.

  create trigger t1_trigger
  before insert on AUDITLOGS
  for each row
   begin
     select t1_seq.nextval into :new.id from dual;
   end;

당신의 테이블 이름으로 테이블 이름(AUDITLOGS)과 new.column_name으로 new.id 을 변경하기만 하면 됩니다.

오라클에는 12c에 시퀀스 AND ID 열이 있습니다.

http://www.oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1.php#identity-columns

저는 이것을 찾았지만 http://www.oracle.com/technetwork/products/rdb/0307-identity-columns-128126.pdf 이 무엇인지 확실하지 않습니다.

다음과 같은 간단한 스크립트를 사용해 보십시오.

http://www.hlavaj.sk/ai.php

결과:

CREATE SEQUENCE TABLE_PK_SEQ; 
CREATE OR REPLACE TRIGGER TR_SEQ_TABLE BEFORE INSERT ON TABLE FOR EACH ROW 

BEGIN
SELECT TABLE_PK_SEQ.NEXTVAL
INTO :new.PK
FROM dual;
END;

언급URL : https://stackoverflow.com/questions/2053313/oracle-how-to-create-an-identity-column

반응형