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_GUID
GUID (전역 적으로 고유 한 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,2,3, ….)
- GUID .
RAW
데이터 형식 으로 사용되는 전역 범용 식별자 . - 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);
첫 번째는 전통적인 방식으로 시퀀스를 사용합니다. 두 번째는 내부적으로 가치를 관리합니다.
답변
SQL Server ID 열과 같은 열을 의미한다고 가정합니까?
Oracle에서는 SEQUENCE를 사용하여 동일한 기능을 수행합니다. 좋은 링크를 찾아 여기에 게시 할 수 있는지 확인하겠습니다.
업데이트 : 직접 찾은 것처럼 보입니다. 어쨌든 링크는 다음과 같습니다.
http://www.techonthenet.com/oracle/sequences.php
답변
Oracle Database 12c는 자동 증분 (시스템 생성) 열인 Identity를 도입했습니다. 이전 데이터베이스 버전 (11g까지)에서는 일반적으로 시퀀스와 트리거를 만들어 Identity를 구현합니다. 12c부터는 고유 한 테이블을 생성하고 ID로 생성해야하는 열을 정의 할 수 있습니다.
다음 기사에서는이를 사용하는 방법에 대해 설명합니다.
답변
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
열에 고유 한 값을 삽입합니다 .
