CHANGE, MODIFY 절

설명

CHANGE 절은 컬럼의 이름을 변경하거나 타입 및 속성을 변경한다. 기존 컬럼의 이름과 새 컬럼의 이름이 같으면 타입 및 속성만 변경한다. 다음은 CHANGE 절을 이용해서 컬럼이 이름을 변경하는 예이다.

CREATE TABLE t1 (a INTEGER);

ALTER TABLE t1 CHANGE a b INTEGER;

다음은 CHANGE 절을 이용해서 컬럼의 속성을 변경하는 예이다.

ALTER TABLE t1 CHANGE a a INTEGER NOT NULL;

MODIFY 절은 컬럼의 타입과 속성을 변경할 수 있으며, 컬럼의 이름은 변경할 수 없다. 다음은 MODIFY 절을 이용해서 컬럼의 속성을 변경하는 예이다.

ALTER TABLE t1 MODIFY a INTEGER NOT NULL;

CHANGE 절이나 MODIFY 절로 새 컬럼에 적용할 타입 및 속성을 설정할 때 기존에 정의된 속성은 새 컬럼의 속성에 전달되지 않는다. 다음 구문은 col1을 BIGINT 타입으로 변경하지만 기존 컬럼에 정의한 "DEFAULT 1" 속성은 포함하지 않는다.

CREATE TABLE t1 (col1 INT DEFAULT 1);

ALTER TABLE t1 MODIFY col1 BIGINT;

위의 예에서  "DEFAULT 1" 속성을 포함하려면 다음과 같이 구문을 작성해야 한다.

ALTER TABLE t1 MODIFY col1 BIGINT DEFAULT 1;

CHANGE 절이나 MODIFY 절로 컬럼에 데이터 타입을 변경할 때, 기존의 컬럼 값이 변경되면서 데이터가 변형될 수 있다. 예를 들어 문자열 컬럼의 길이를 줄이면 문자열이 잘릴 수 있으므로 주의해야 한다.

주의 CUBRID 2008 R3.1 이하 버전에서 사용되었던 CHANGE 구문은 더 이상 지원하지 않는다.

구문

ALTER TABLE tbl_name table_options;

 

table_options :

     table_option[, table_option]

 

table_option :

    CHANGE [COLUMN | CLASS ATTRIBUTE ] old_col_name new_col_name column_definition

             [FIRST | AFTER col_name]

  | MODIFY [COLUMN | CLASS ATTRIBUTE] col_name column_definition

             [FIRST | AFTER col_name]

컬럼의 속성에 따른 구문 동작
시스템 파라미터 alter_table_change_type_strict에 따른 구문 동작

alter_table_change_type_strict 파라미터는 타입 변경에 따른 값의 변환을 허용하는지 여부를 결정한다. 값이 no이면 컬럼의 타입을 변경하거나 NOT NULL 제약 조건을 추가할 때 값이 변경될 수 있다. 기본값은 no이다.

alter_table_change_type_strict 파라미터의 값이 no이면 상황에 따라 다음과 같이 동작한다.

alter_table_change_type_strict 파라미터의 값이 yes이면 위의 모든 경우에 에러 메시지를 출력하고 변경 내용을 롤백한다.

ALTER CHANGE 문은 레코드를 업데이트하기 전에 해당 타입 변환이 가능한지 검사하지만, 특정 값은 타입 변환에 실패할 수도 있다. 예를 들어, VARCHARDATE로 변환할 때 값의 형식이 올바르지 않으면 변환에 실패할 수 있으며, 이때에는 DATE 타입의 고정 기본값(hard default value)이 지정된다.

고정 기본값(hard default value)은 ALTER TABLE … ADD  COLUMN 문에 의한 컬럼 추가 혹은 ALTER TABLE … CHANGE/MODIFY 문에 의한 타입 변환으로 값이 추가되거나 변경될 때 사용되는 값이다. ADD COLUMN 문에서는 add_column_update_hard_default 시스템 파라미터에 따라 동작이 달라진다.

타입별 고정 기본값

타입

고정 기본값 유무

고정 기본값

INTEGER

0

FLOAT

0

DOUBLE

0

SMALLINT

0

DATE

date'01/01/0001'

TIME

time'00:00'

DATETIME

datetime'01/01/0001 00:00'

TIMESTAMP

timestamp'00:00:00 PM 01/01/1970'

MONETARY

0

NUMERIC

0

CHAR

''

VARCHAR

''

NCHAR

N''

VARNCHAR

N''

SET

{}

MULTISET

{}

SEQUENCE

{}

BIGINT

0

BIT

 

VARBIT

 

OBJECT

 

BLOB

 

CLOB

 

ELO

 

예제 1

-- changing the name and position of a column  

CREATE TABLE t1(i1 int,i2 int);  

INSERT INTO t1 VALUE (1,11),(2,22),(3,33);  

SELECT * FROM t1 ORDER BY 1;

            i1           i2

==========================

             1           11

             2           22

             3           33

 

ALTER TABLE t1 CHANGE i2 i0 INTEGER FIRST;  

SELECT * FROM t1 ORDER BY 1;

            i0           i1

==========================

            11            1

            22            2

            33            3

예제 2

-- adding NOT NULL constraint (strict)

-- alter_table_change_type_strict=yes

 

CREATE TABLE t1(i int);

INSERT INTO t1 values (11),(NULL),(22);

 

ALTER TABLE t1 change i i1 integer not null;

 

In the command from line 1,

 

ERROR: Cannot add NOT NULL constraint for attribute "i1": there are existing NULL values for this attribute.

예제 3

-- adding NOT NULL constraint

-- alter_table_change_type_strict=no

 

CREATE TABLE t1(i int);

INSERT INTO t1 VALUES (11),(NULL),(22);

 

ALTER TABLE t1 CHANGE i i1 INTEGER NOT NULL;

 

SELECT * FROM t1;

 

           i1

=============

           22

            0

           11

예제 4

-- change the column's data type (no errors)

 

CREATE TABLE t1 (i1 int);

INSERT INTO t1 VALUES (1),(-2147483648),(2147483647);

 

ALTER TABLE t1 CHANGE i1 s1 CHAR(11);

 

SELECT * FROM t1;

 

  s1

======================

  '2147483647 '

  '-2147483648'

  '1          '

예제 5

-- change the column's data type (errors), strict mode

-- alter_table_change_type_strict=yes

 

CREATE TABLE t1 (i1 int);

INSERT INTO t1 VALUES (1),(-2147483648),(2147483647);

 

ALTER TABLE t1 CHANGE i1 s1 CHAR(4);

 

In the command from line 1,

 

ERROR: ALTER TABLE .. CHANGE : changing to new domain : cast failed, current configuration doesn't allow truncation or overflow.

 

-- change the column's data type (errors)

-- alter_table_change_type_strict=no

 

CREATE TABLE t1 (i1 INT);

INSERT INTO t1 VALUES (1),(-2147483648),(2147483647);

 

ALTER TABLE t1 CHANGE i1 s1 CHAR(4);

 

SELECT * FROM t1;

 

  s1

======================

  '    '

  '    '

  '1   '

 

-- hard default values have been placed instead of signaling overflow