2013년 12월 25일 수요일

[오라클12C새기능]ORACLE12C자동증분컬럼, ID컬럼(Identity Columns in Oracle Database 12c) [재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육]

[오라클12C새기능]ORACLE12C자동증분컬럼, ID컬럼(Identity Columns in Oracle Database 12c) [재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육]

[오라클12C새기능]ORACLE12C자동증분컬럼, ID컬럼(Identity Columns in Oracle Database 12c)
 
오라클12C 이전에는 다른 데이터베이스에서 사용되는 자동증분컬럼에 대한 정의는 없었다. 대부분 오라클 시퀀스나 트리거를  이용하여 처리하곤 했는데 ORACLE12C에 생겨 다행이다.^^

[형식]
GENERATED
[ ALWAYS | BY DEFAULT [ ON NULL ] ]
AS IDENTITY [ ( identity_options ) ]
 
아래 예제를 테스트 하기 위해서는 create table, create sequence 권한이 있어야 한다.
(conn / as sysdba 후 grant create table, create sequence to 유저명)
 
1. ALWAYS를 이용한 default value 정의
(ID컬럼에 NULL이든 아니든 값을 입력할 수 없다.)

CREATE TABLE test (
  id          NUMBER GENERATED ALWAYS AS IDENTITY,
  name        VARCHAR2(10)
);
SQL> INSERT INTO test (name) VALUES ('홍길동');
1 row created.
SQL> INSERT INTO test (id, name) VALUES (NULL, '널길동');
INSERT INTO test (id, name) VALUES (NULL, '널길동')
                               *
ERROR at line 1:
ORA-32795: cannot insert into a generated always identity column

SQL> INSERT INTO test (id, name) VALUES (9, '9길동');
INSERT INTO test (id, name) VALUES (9, '9길동')
                               *
ERROR at line 1:
ORA-32795: cannot insert into a generated always identity column
 
2.  BY DEFAULT를이용한 default value 정의
(ID컬럼에 NULL을 제외하고는  값을 입력할 수 없다.)
 
CREATE TABLE test (
  id          NUMBER GENERATED BY DEFAULT AS IDENTITY,
  name        VARCHAR2(10)
);
SQL> INSERT INTO test (name) VALUES ('홍길동');
1 row created.
SQL> INSERT INTO test (id, name) VALUES (9, '9길동');
1 row created.
SQL> INSERT INTO test (id, name) VALUES (NULL, '널길동');
INSERT INTO test (id, description) VALUES (NULL, '널길동')
                                                        *
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."TEST"."ID")

3. DEFAULT ON NULL을 이용한 default value 정의
(ID컬럼에 NULL이든 아니든 값을 입력할 수 있다. 입력안하면 기본값으로 set)
 
CREATE TABLE test (
  id          NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
  name        VARCHAR2(10)
);
SQL> INSERT INTO test (name) VALUES ('홍길동');
1 row created.
SQL> INSERT INTO test (id, name) VALUES (9, '9길동');
1 row created.
SQL> INSERT INTO test (id, name) VALUES (NULL, '널길동');
1 row created.
SQL> SELECT * FROM test;
 ID NAME
---------- ------------------------------
  1 홍길동
         9 9길동
  2 널길동
 
 
아래 질의를 보자. 자동증분컬럼 ID컬럼은 내부적으로 오라클 시퀀스로 이루어짐을 알 수 있다. 

SELECT table_name,
       column_name,
       generation_type,
       identity_options
FROM   all_tab_identity_cols
WHERE  owner = 'SCOTT'
ORDER BY 1, 2;
TABLE_NAME           COLUMN_NAME     GENERATION IDENTITY_OPTIONS
-------------------- --------------- ---------- ----------------------------------------
TEST                   ID              ALWAYS     START WITH: 1, INCREMENT BY: 1, MAX_VALUE: 9999999
                                                999999999999999999999, MIN_VALUE: 1, CYCLE_FLAG: N
                                                , CACHE_SIZE: 20, ORDER_FLAG: N

댓글 없음:

댓글 쓰기