[sql] Oracle에서 AUTO_INCREMENT로 ID를 만드는 방법은 무엇입니까?

Oracle에는 버전 11g까지 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)
    );

또는 시작 및 증분 값을 지정하여 식별 열에 삽입하지 못하도록합니다 ( 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_GUIDGUID (전역 적으로 고유 한 ID)를 반환합니다. A 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;

Oracle 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)
);

그리고 오라클에서 (Pre 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 (문자열) . 위와 동일하지만 일부 언어에서는 다루기가 더 쉬운 문자열입니다.

xID 열입니다. 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);

첫 번째는 전통적인 방식으로 시퀀스를 사용합니다. 두 번째는 내부적으로 가치를 관리합니다.


답변

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

Oracle에서는 SEQUENCE를 사용하여 동일한 기능을 수행합니다. 좋은 링크를 찾아 여기에 게시 할 수 있는지 확인하겠습니다.

업데이트 : 직접 찾은 것처럼 보입니다. 어쨌든 링크는 다음과 같습니다.
http://www.techonthenet.com/oracle/sequences.php


답변

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

다음 기사에서는이를 사용하는 방법에 대해 설명합니다.

ID 열-Oracle Database 12c의 새로운 항목


답변

Trigger그리고 Sequence당신이 누구나 쉽게 / 기억 / 읽고 이해할 수있는 일련 번호를하고자 할 때 사용할 수 있습니다. 그러나 이런 식으로 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열에 고유 한 값을 삽입합니다 .