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, 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);
첫 번째는 전통적인 방식으로 시퀀스를 사용하고, 두 번째는 내부적으로 값을 관리합니다.
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 열을 지원합니다.
시퀀스 + 표 - 이 솔루션에서는 일반적인 방식으로 시퀀스를 생성한 다음 다음 DDL을 사용합니다.
CREATE TABLE MyTable(ID NUMBER DEFAULT MyTable_Seq).다음 값, ...)
표만 - 이 솔루션에서는 시퀀스가 명시적으로 지정되지 않았습니다.다음 DDL을 사용합니다.
CREATE TABLE MyTable(ID 번호가 ID로 생성됨, ...)
첫 번째 방법을 사용하면 기존 방식과 역호환됩니다.두 번째는 조금 더 단순하고 다른 RDMS 시스템과 더 일치합니다.
은 고라합니다라고 불립니다.Identity Columns
Oracle 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 이 무엇인지 확실하지 않습니다.
다음과 같은 간단한 스크립트를 사용해 보십시오.
결과:
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
'programing' 카테고리의 다른 글
선택 쿼리 내에서 저장 프로시저를 실행하는 방법 (0) | 2023.07.09 |
---|---|
Git 저장소의 처음 두 커밋을 결합하시겠습니까? (0) | 2023.07.09 |
sqlplus 원격 연결 제공 ORA-21561 (0) | 2023.07.09 |
Mac용 Office 2011의 VBA 셸 기능 (0) | 2023.07.09 |
django에서 그룹에 사용자 추가 (0) | 2023.07.09 |