복붙노트

[SQL] 어떻게 오라클에 AUTO INCREMENT와 ID를 만드는 방법?

SQL

어떻게 오라클에 AUTO INCREMENT와 ID를 만드는 방법?

이 때까지 및 버전 11g까지 포함, 오라클에서 AUTO_INCREMENT의 개념이없는 것으로 보인다.

어떻게 오라클 11g의 자동 증가와 같은 동작하는지 열을 만들 수 있습니까?

해결법

  1. ==============================

    1."AUTO_INCREMENT"또는 Oracle 11g의 오라클의 "정체성"열 같은 건 없다. 그러나, 당신은 순서 및 트리거로 쉽게 모델링 할 수 있습니다 :

    "AUTO_INCREMENT"또는 Oracle 11g의 오라클의 "정체성"열 같은 건 없다. 그러나, 당신은 순서 및 트리거로 쉽게 모델링 할 수 있습니다 :

    표 정의 :

    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 열은 오라클 12C에서 사용할 수 있습니다 :

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

    또는도 (ALWAYS 생성됨) 식별 열에있는 삽입 방지 시작 값 및 증분 지정 (다시을 오라클 12C + 만)

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

    또한, 오라클 (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));
    
  2. ==============================

    2.SYS_GUID는 GUID-- 글로벌 고유 ID를 반환합니다. SYS_GUID는 RAW (16)이다. 그것은 증가하는 숫자 값을 생성하지 않습니다.

    SYS_GUID는 GUID-- 글로벌 고유 ID를 반환합니다. SYS_GUID는 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>>
    )
    
  3. ==============================

    3.오라클 12C에서 이후 당신이 뭔가를 같이 할 수있는,

    오라클 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)
    );
    

    그리고 오라클 (사전의 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;
    /
    
  4. ==============================

    4.여기에 세 가지 맛은 다음과 같습니다 :

    여기에 세 가지 맛은 다음과 같습니다 :

    X는 식별 컬럼이다. 예제의 각 테이블 이름으로 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;
    /
    

    최신 정보:

    오라클 12c는 트리거에 의존하지 않는이 두 가지 변종을 소개합니다 :

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

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

  5. ==============================

    5.당신은 SQL 서버 ID 열 같은 열을 의미하는 가정?

    당신은 SQL 서버 ID 열 같은 열을 의미하는 가정?

    오라클에서는 동일한 기능을 달성하기 위해 SEQUENCE를 사용합니다. 나는 좋은 링크를 발견하고 여기에 게시 수 있는지 보자.

    업데이트 : 당신 같은 외모가 스스로를 발견했다. 여기에 링크 어쨌든입니다 : http://www.techonthenet.com/oracle/sequences.php

  6. ==============================

    6.오라클 데이터베이스 12c는 신원, 자동 증분 (시스템 생성) 컬럼을 소개했다. 이전 데이터베이스 버전 (11g까지), 보통 시퀀스 및 트리거를 작성하여 아이덴티티를 구현합니다. 이후 12C에서, 당신은 당신의 자신의 표를 작성하고 ID로 발생하는 열을 정의 할 수 있습니다.

    오라클 데이터베이스 12c는 신원, 자동 증분 (시스템 생성) 컬럼을 소개했다. 이전 데이터베이스 버전 (11g까지), 보통 시퀀스 및 트리거를 작성하여 아이덴티티를 구현합니다. 이후 12C에서, 당신은 당신의 자신의 표를 작성하고 ID로 발생하는 열을 정의 할 수 있습니다.

    다음 문서를 사용하는 방법을 설명합니다 :

    ID 열 - 오라클 데이터베이스 12C의 새로운 항목

  7. ==============================

    7.당신이 누구나 쉽게 / 기억 / 읽고 이해할 수있는 일련 번호를 할 때 트리거와 시퀀스를 사용할 수 있습니다. 그러나이 방법으로 (EMP_ID 같은) ID 열을 관리하지 않는 경우,이 컬럼의 값이 많이 상당한 없다, 당신은 다음과 같이 자동 증가를 얻기 위해 표 작성시 SYS_GUID ()를 사용할 수 있습니다.

    당신이 누구나 쉽게 / 기억 / 읽고 이해할 수있는 일련 번호를 할 때 트리거와 시퀀스를 사용할 수 있습니다. 그러나이 방법으로 (EMP_ID 같은) 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 열 고유 값을 삽입합니다.

  8. ==============================

    8.오라클 12C를 시작으로 두 가지 방법 중 하나를 식별 컬럼에 대한 지원이있다 :

    오라클 12C를 시작으로 두 가지 방법 중 하나를 식별 컬럼에 대한 지원이있다 :

    첫 번째 방법을 사용하는 경우는 일을하는 기존의 방식과 호환됩니다. 두 번째는 좀 더 간단하고 거기 밖으로 RDMS 시스템의 나머지 부분과 더 인라인입니다.

  9. ==============================

    9.이 ID 열이라고하며 그것은 단지 오라클 오라클 12C에서 사용할 수 있습니다

    이 ID 열이라고하며 그것은 단지 오라클 오라클 12C에서 사용할 수 있습니다

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

    아래와 같이 ID 열로 삽입의 예

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

    아래처럼 삽입 할 수 없다

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

    유용한 링크

  10. ==============================

    10.여기에 예외 / 오류가 자동 증가에 대한 처리 w.r.t 완벽한 솔루션입니다,이 솔루션은 이전 버전과 호환하고 응용 프로그램이 생산에 특별히 경우, 11g 및 12C에서 작동합니다.

    여기에 예외 / 오류가 자동 증가에 대한 처리 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;
    /
    
  11. ==============================

    11.나는 기존의 테이블과 열 (이름 ID)에 이런 짓을하는 방법입니다 :

    나는 기존의 테이블과 열 (이름 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;
    
  12. ==============================

    12.

    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;
    
  13. ==============================

    13.

    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;
    
  14. ==============================

    14.오라클은 12C의 시퀀스 및 ID 열이

    오라클은 12C의 시퀀스 및 ID 열이

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

    나는이를 찾았지만 확인 (7)가 무엇인지 RDB하지 http://www.oracle.com/technetwork/products/rdb/0307-identity-columns-128126.pdf

  15. ==============================

    15.

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

    단지 나는 new.column_name와 당신의 테이블 이름과 테이블 이름 (AUDITLOGS)을 변경해야하고 new.id

  16. ==============================

    16.어쩌면 그냥이 간단한 스크립트를 시도 :

    어쩌면 그냥이 간단한 스크립트를 시도 :

    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;
    
  17. from https://stackoverflow.com/questions/11296361/how-to-create-id-with-auto-increment-on-oracle by cc-by-sa and MIT license