[SQL] 어떻게 오라클에 AUTO INCREMENT와 ID를 만드는 방법?
SQL어떻게 오라클에 AUTO INCREMENT와 ID를 만드는 방법?
이 때까지 및 버전 11g까지 포함, 오라클에서 AUTO_INCREMENT의 개념이없는 것으로 보인다.
어떻게 오라클 11g의 자동 증가와 같은 동작하는지 열을 만들 수 있습니까?
해결법
-
==============================
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.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.오라클 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.여기에 세 가지 맛은 다음과 같습니다 :
여기에 세 가지 맛은 다음과 같습니다 :
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.당신은 SQL 서버 ID 열 같은 열을 의미하는 가정?
당신은 SQL 서버 ID 열 같은 열을 의미하는 가정?
오라클에서는 동일한 기능을 달성하기 위해 SEQUENCE를 사용합니다. 나는 좋은 링크를 발견하고 여기에 게시 수 있는지 보자.
업데이트 : 당신 같은 외모가 스스로를 발견했다. 여기에 링크 어쨌든입니다 : http://www.techonthenet.com/oracle/sequences.php
-
==============================
6.오라클 데이터베이스 12c는 신원, 자동 증분 (시스템 생성) 컬럼을 소개했다. 이전 데이터베이스 버전 (11g까지), 보통 시퀀스 및 트리거를 작성하여 아이덴티티를 구현합니다. 이후 12C에서, 당신은 당신의 자신의 표를 작성하고 ID로 발생하는 열을 정의 할 수 있습니다.
오라클 데이터베이스 12c는 신원, 자동 증분 (시스템 생성) 컬럼을 소개했다. 이전 데이터베이스 버전 (11g까지), 보통 시퀀스 및 트리거를 작성하여 아이덴티티를 구현합니다. 이후 12C에서, 당신은 당신의 자신의 표를 작성하고 ID로 발생하는 열을 정의 할 수 있습니다.
다음 문서를 사용하는 방법을 설명합니다 :
ID 열 - 오라클 데이터베이스 12C의 새로운 항목
-
==============================
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.오라클 12C를 시작으로 두 가지 방법 중 하나를 식별 컬럼에 대한 지원이있다 :
오라클 12C를 시작으로 두 가지 방법 중 하나를 식별 컬럼에 대한 지원이있다 :
첫 번째 방법을 사용하는 경우는 일을하는 기존의 방식과 호환됩니다. 두 번째는 좀 더 간단하고 거기 밖으로 RDMS 시스템의 나머지 부분과 더 인라인입니다.
-
==============================
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.여기에 예외 / 오류가 자동 증가에 대한 처리 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.나는 기존의 테이블과 열 (이름 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.
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.
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.오라클은 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.
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.어쩌면 그냥이 간단한 스크립트를 시도 :
어쩌면 그냥이 간단한 스크립트를 시도 :
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;
from https://stackoverflow.com/questions/11296361/how-to-create-id-with-auto-increment-on-oracle by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 조인 가입 및 다른 유형의 SQL 지 (0) | 2020.03.06 |
---|---|
[SQL] A는 관계를 통해-많은이에 SQL 결과를 필터링하는 방법 (0) | 2020.03.06 |
[SQL] 엔티티 프레임 워크에 삽입하는 가장 빠른 방법 (0) | 2020.03.06 |
[SQL] 빠른 600K 행에서 10 개 임의의 행을 선택 MYSQL (0) | 2020.03.06 |
[SQL] 삽입, PostgreSQL의 중복 업데이트에 대한? (0) | 2020.03.06 |