ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [GOLDILOCKS] 테이블 IDENTITY 컬럼 제약사항 및 사용해보기
    Goldilocks DBMS/실습하기 2018.05.18 16:19

    GOLDILOCKS 의 IDENTITY 컬럼 지원 속성



     - GENERATED BY DEFAULT AS IDENTITY

     - GENERATED ALWAYS AS IDENTITY



    GENERATED BY DEFAULT AS IDENTITY 제약사항 및 사용예제



    제약사항

     1. 사용자가 값을 지정한 경우 이를 적용하나, 지정되지 않은 경우 자동값을 생성한다.

     2. 사용자가 값을 지정한 경우, 자동값은 증가하지 않는다.



    사용예제

     1. 테이블을 생성합니다.

    gSQL> CREATE TABLE T1 (C1 INT GENERATED BY DEFAULT AS IDENTITY, C2 INT);
    
    Table created.

     2. C2 컬럼에 데이터를 삽입합니다.

    gSQL> INSERT INTO T1 (C2) VALUES (1); 1 row created. gSQL> INSERT INTO T1 (C2) VALUES (2); 1 row created.

     3. T1 테이블의 데이터를 조회합니다. C1 컬럼의 값이 자동생성 및 증가되었다는 것을 알 수 있습니다.

    gSQL> SELECT * FROM T1; C1 C2 -- -- 1 1 2 2 2 rows selected.

     4. C1, C2 컬럼에 데이터를 삽입합니다.

    gSQL> INSERT INTO T1 (C1, C2) VALUES (3, 3);
    
    1 row created.
    
    gSQL> INSERT INTO T1 (C2) VALUES (4);
    
    1 row created.

     5. C1 컬럼에 데이터를 직접 넣었을 때, 자동값이 증가하지 않음을 알 수 있습니다.

    gSQL> select * from t1;
    
    C1 C2
    -- --
     1  1
     2  2
     3  3
     3  4
    
    4 rows selected.



    GENERATED ALWAYS AS IDENTITY 제약사항 및 사용예제



    제약사항

     1. 사용자가 값을 지정할 수 없으며, 자동으로 값이 증가한다.


    사용예제

     1. 테이블을 생성합니다.

    gSQL> CREATE TABLE T1 (C1 INT GENERATED ALWAYS AS IDENTITY , C2 INT); Table created.

     2. 데이터를 적재합니다.

    gSQL> INSERT INTO T1 (C2) VALUES (1); 1 row created. gSQL> INSERT INTO T1 (C2) VALUES (2); 1 row created.

     3. C1 컬럼에 값을 지정하려고 시도하는 경우, 에러가 발생합니다.

    GSQL> INSERT INTO T1 (C1, C2) VALUES (3, 3); ERR-42000(16399): cannot insert or update a generated always identity column, value shall be a DEFAULT : INSERT INTO T1 (C1, C2) VALUES (3, 3) * ERROR at line 1:


    데이터베이스를 재시작 하는 경우 위의 값들은 어떻게 될까?



    T1 테이블을 생성한 뒤에 데이터를 적재합니다.

    gSQL> CREATE TABLE T1 (C1 INT GENERATED ALWAYS AS IDENTITY , C2 INT)
    gSQL> INSERT INTO T1 (C2) VALUES (1)
    gSQL> COMMIT;
    gSQL> SELECT * FROM T1;
    
    C1 C2
    -- --
     1  1
    
    1 row selected.


    데이터베이스를 재시작 후, 데이터를 적재한 뒤 C1 컬럼을 조회하면 2 가 아니라 21 로 설정됩니다.

    gSQL> INSERT INTO T1 (C2) VALUES (2);
    gSQL> COMMIT;
    gSQL> SELECT * FROM T1;
    
    C1 C2
    -- --
     1  1
    21  2
    
    2 rows selected.


    왜그럴까요?

    데이터베이스가 내려갔다 올라오면서, IDENTITY 컬럼의 다음값이 캐시에 설정된 값으로 설정되기 때문입니다.

    따라서 IDENTITY 커럼이 있는 경우 디비를 재구동 전, 현재 값을 반드시 확인한 후 재구동 후에 변경작업을 수행해주어야 합니다.

    TABLE_NAME COLUMN_NAME RESTART_VALUE INCREMENT_BY MINVALUE            MAXVALUE ALTER_NEXT_SQL                                
    ---------- ----------- ------------- ------------ -------- ------------------- ----------------------------------------------
    T1         C1                     41            1        1 9223372036854775807 ALTER TABLE X1 ALTER COLUMN C1 RESTART WITH 22


    댓글 0

Designed by Tistory.