본문 바로가기
Database/MYSQL

Mysql euckr -> utf8mb4 변환시 ALTER [IGNORE] 참고

by 반화넬 2024. 4. 17.
반응형



ALTER [IGNORE] TABLE tbl_name

    alter_specification [, alter_specification] ...

 

alter_specification:

    ADD [COLUMN] column_definition [FIRST | AFTER col_name ]

  | ADD [COLUMN] (column_definition,...)

  | ADD INDEX [index_name] [index_type] (index_col_name,...)

  | ADD [CONSTRAINT [symbol]]

        PRIMARY KEY [index_type] (index_col_name,...)

  | ADD [CONSTRAINT [symbol]]

        UNIQUE [INDEX] [index_name] [index_type] (index_col_name,...)

  | ADD [FULLTEXT|SPATIAL] [INDEX] [index_name] (index_col_name,...)

  | ADD [CONSTRAINT [symbol]]

        FOREIGN KEY [index_name] (index_col_name,...)

        [reference_definition]

  | ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}

  | CHANGE [COLUMN] old_col_name column_definition

        [FIRST|AFTER col_name]

  | MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]

  | DROP [COLUMN] col_name

  | DROP PRIMARY KEY

  | DROP INDEX index_name

  | DROP FOREIGN KEY fk_symbol

  | DISABLE KEYS

  | ENABLE KEYS

  | RENAME [TO] new_tbl_name

  | ORDER BY col_name

  | CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]

  | [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]

  | DISCARD TABLESPACE

  | IMPORT TABLESPACE

  | table_options

 

ALTER TABLE은 여러분이 현재 테이블의 구조를 변경할 수 있도록 한다. 한 예로, 여러분은 컬럼 추가/삭제, 인덱스 생성/삭제, 기존 컬럼의 type변경, 테이블 혹은 컬럼 자체의 이름 변경을 할 수 있다. 여러분은 또한 테이블의 type과 테이블을 위한 주석을 변경 할 수도 있다.

 

많은 변경을 위한 구문은 CREATE TABLE문의 구문과 유사하다. 이는 ENGINE, AUTO_INCREMENT 그리고 AVG_ROW_LENGTH와 같은 옵션들과 같이 table_options 변경을 포함한다.(반면, ALTER TABLE문은  DATA DIRECTORY 과 INDEX DIRECTORY 테이블 옵션은 무시한다.)

13.1.5  CREATE TABLE 에서 모든 테이블 옵션에 대해 설명한다.

 

몇몇 기능들은 저장 엔진이 그 기능을 지원하지 않을 경우 테이블에 대해 어떤 시도를 할 경우 warning을 보낼 수 있다. 이들 warning은 SHOW WARNINGS와 함께 보여진다. 이에 대한 내용은 13.5.4.25 "SHOW WARNINGS"를 참조하라.

 

여러분이 하나의 컬럼 지정을 변경 하기 위해 ALTER TABLE 사용하지만 DESCRIBE tbl_name 에는 여러분의 컬럼이 변경하지 않은 것으로 표시된다면, 13.1.5.1” 암묵적인 컬럼 지정 변경에서 설명하는 이유 중 하나로 인해 MySQL이 변경한 사항을 인식하지 못할 수 있다.

 

대부분의 경우, ALTER TABLE은 원본 테이블의 임시 복사본을 만들어서 작업을 한다. 변경 이 복사본에서 수행되고 원본 테이블이 지워지고 새로이 이름 지워진다. ALTER TABLE이 수행되는 동안 원본 테이블은 다른 클라이언트들에 의해 읽혀질  수 있다. 테이블에 업데이트와 쓰기는 새로운 테이블이 준비될 때까지 거부되며, 자동으로 update의 실패 없이 새로운 테이블로 다시 향한다.

 

여러분이 다른 옵션 없이 ALTER TABLE 테이블이름 RENAME TO 새 테이블 이름 을 사용한다면 MySQL은 단순히 테이블 이름과 일치하는 파일들의 이름만 바꾸게 된다. 이때는 임시 테이블을 생성할 필요가 없다. (여러분은 테이블들을 재 명명 하기 위해서 RENAME TABLE 문을 사용할 수 있다. 13.1.9 "RENAME TABLE"을 참조하라.)

 

여러분이 RENAME보다 ALTER TABLE에 옵션을 사용하면 MySQL은 컬럼의 이름을 변경하는 것과 같이 그 데이타가 복사될 필요가 없을 지라도, 항상 임시 테이블을 생성한다. MyISAM 테이블들에 대해, 여러분은 myisam_sort_buffer_size시스템 변수를 높은 값으로 설정함으로써 인덱스 재 생성 작업(이것은 변경 처리 작업의 가장 느린 부분에 해당한다.)의 속도를 증가 시킬수 있다

 

ALTER TABLE을 사용하기 위해 여러분은 테이블에 대한 ALTER, INSERT 그리고 CREATE 권한을 가져야 한다.

 

IGNORE는 표준 SQL에서 MySQL의 확장이다. 이것은 새로운 테이블에 unique key들이 중복될때 ALTER TABLE이 작동하는 방법이나 엄격 모드(strict mode)가 장동할때 warning이 났을때 등을 제어 한다. IGNORE가 명시 된 경우, 즉 첫번째 열이 unique key에서 중복 되어 존재 할 경우 , 다른 충돌되는 열들은 삭제 된다.  정확 하지 않은 값들은 가능한 수용 가능한 값으로 수정된다.

 

여러분은 한 ALTER TABLE문에서 콤마로 구분하여 다수 ADD, ALTER, DROP 그리고 CHANGE문을 사용할 수 있다. 이것은 표준 SQL에 대한 MySQL의 확장인데 이것은 각 ALTER TABLE문에서 각 구문의 하나를 허락하는 것이다. 예를 들면, 하나의 문에서 여러개의 컬럼을 drop하려 할경우 다음과 같이 하면 된다. 

 

ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d;

 

CHANGE col_name, DROP col_name, 그리고 DROP INDEX 표준 SQL에대한 MySQL 확장이다.

 

MODIFY ALTER TABLE에서 Oracle확장이다.

 

COLUMN은 옵션이며 생략 가능하다.

 

column_definition문들은 CREATE TABLE에서처럼 ADD와 CHANGE를 위해 같은 구문을 사용한다. 이 구문이 컬럼 이름을 포함하는것에 주의 해야 한다. 이에 대한 자세한 사항은 13.1.5 "CREATE TABLE"을 참고한다.

 

여러문은 CHANGE 옛 컬럼 이름  새 컬럼 이름 구문을 사용하여 하나의 컬럼을 재 명명 할 수 있다. 이를 위해 기존 컬럼 과 새 컬럼 이름들과 그 타입도 명시 하도록 한다. 예로써 INTEGER형인 컬럼 a를 b로 변경 하려 하면 다음과 같이;

 

ALTER TABLE t1 CHANGE a b INTEGER;

 

만일 여러분이 컬럼의 이름이 아닌 type을 변경하기 원한다 해도 CHANGE문은 앞의 것과 같이 사용한다. 예로서 아래와 같이 사용 할 수 있다.

 

ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;

 

여러분은 또한 컬럼의 이름을 재 명명 하지 않고 컬럼의 type만을 변경 하기 위해 아래와 같이 MODIFY를 사용할 수 있다.

 

ALTER TABLE t1 MODIFY b BIGINT NOT NULL;

 

여러분은 한 인덱스가 컬럼에 존재하도록 하기 위해 컬럼을 짧게하는 경우, 결과 적으로 컬럼 길이가 인덱스 길이보다 짧을때 MySQL은 인덱스를 자동으로 짧게 한다.

 

여러분이 CHANGE 나 MODIFY를 사용하여 데이터 타입을 변경 하는 경우, MySQL은 기존의 컬럼 값들을 가능한한 새로운 타입으로 변경 하려 한다.

 

한 테이블 열에서 특정 위치에 컬럼을 추가 하기 위해서는 FIRST 혹은 AFTER 컬럼 이름 을 사용한다. 기본적으로는 컬럼을 가장 마지막 부분에 추가 한다. 여러분은 또한 CHANGE나 MODIFY 기능들에서 FIRST 와 AFTER를 사용할 수 있다.

 

ALTER ... SET DEFAULT 혹은 ALTER ... DROP DEFAULT은 각각 한 커럼에 대한 새로운 기본 값을 명시 하거나  기존 값을 지우도록 한다. 기존 기본값이 지워지고 그 컬럼이 NULL값이 될 수 있으면 새로운 기본 값은 NULL이 된다. 만일 그 컬럼이 NULL이 될 수 없다면, MySQL은 기본 값을 할당하는데 이에 대한 내용은 11.1.4 "데이터 타입 기본값들(Data Type Default Values)"를 참조 하라.

 

DROP INDEX는 한 인덱스를 삭제 한다. 이것은 표준 SQL에 대한 MySQL의 확장이다. 13.1.7 "DROP INDEX"를 참조 하라.

 

컬럼들이 한 테이블로부터 삭제되면, 그 컬럼들은 또한 그들이 한 부분인 인덱스로부터 삭제 된다. 한 인덱스를 구성하는 모든 컬럼들이 삭제 되면 그 인덱스 또한 삭제 된다.

 

한 테이블이 단지 하나의 컬럼을 가지고 있을 경우, 그 컬럼은 삭제 될 수 없다. 여러분이 의도하는 것이 테이블을 삭제 하는 것이라면 DROP TABLE을 대신 사용하도록 하라.

 

DROP PRIMARY KEY는 primary 키를 삭제 한다. 주의 : MySQL의 이전 버전에서는 primary키가 존재 하지 않을 경우 DROP PRIMARY KEY는 테이블에서 첫번째 UNIQUE 인덱스를 삭제 했었다. 그러나 MySQL 5.0에서는 primary 키가 없는 테이블에서 DROP PRIMARY KEY를 사용하려 할때 에러를 일이킨다.

 

여러분이 테이블에 UNIQUE INDEX나 PRIMARY KEY를 추가 하면, 이것은 비 unique 인덱스 앞에 저장되어 MySQL이 가능한 한 빨리 중복 키를 찾을 수 있도록 한다.

 

ORDER BY는 여러분이 특정 순서대로 열을 가진 새 테이블을 생성하도록 한다. 삽입/삭제문 사용 후에는 이 순서대로 유지 되지 않음을 주의 하도록 한다. 이 옵션은 대부분 어떤 순서로 열들을 질의 하는 경우 가장 유용하다. 그 테이블에 대해 큰 변경후에 이 옵션을 사용 함으로써 여러분은 높은 처리 능력을 가지게 된다. 어떤 경우, 이것은 테이블이 여러분이 원하는 순서대로 정렬할 컬럼의 순서대로 있다면 MySQL이 정렬을 쉽게 할 것이다.

 

여러분이 MyISAM 테이블에서 ALTER TABLE을 사용한다면 모든 non-unique인덱스들은 개별 배치(REPAIR TABLE에서와 같이)로 생성 된다. 이것은 여러분이 많은 인덱스를 가질때 ALTER TABLE은 훨씬 빠르게 만들것이다.

 

이 특징은 명백하게(explicitly) 활성화 될 수 있다. ALTER TABLE...DISABLE KEYS는 MySQL에게 MyISAM 테이블에서 non-unique 인덱스들을 업데이트 하는것을 정지 시키도록 한다. MySQL은 하나씩 key들을 삽입하는 것보다 훨씬 빠른 특별한 알고리즘으로 이것을 수행하며, 대량의 삽입 작업 들을 수행 하기 이전 키들을 금지하여 현저한 속도 향상이 이루어 진다. ALTER TABLE....DISABLE KEYS는 이전에 언급한 권한 외에 추가적으로 INDEX 권한을 요구한다.

 

FOREIGN KEY 와 REFERENCES 구문은 InnoDB 저장 엔진에 의해 지원되는데, 이들은 ADD [CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES ... (...)을 제공한다. 14.2.6.4 FOREIGN KEY 제약"을 참고한다. 다른 저장 엔진들에 대해서는 이 구문이 분석은 되어지나 무시된다. CHECK 구문은 모든 저장 엔진에 의해서 무시된다. 이에 대한 내용은 13.1.5 CREATE TABLE 을 참조하라. 이처럼 구문을 받아들이지만 무시 하는 이유는 호환성때문인데 다른 SQL 서버로 포팅을 쉽게 한다던가 테이블을 생성하는 응용 프로그램을 실행 시키기 쉽게 하도록 하기 위해서이다. 자세한 내용은 1.9.5 "표준 SQL과 MySQL의 차이점"을 참조하도록 한다.

 

여러분은 하나의 ALTER TABLE문의 부분 절에서 외래키를 추가 와 삭제를 할 수 없다. 분리된 문장들에서 사용하여야 한다.

 

InnoDB는 외래 키들을 삭제 하기 위해 ALTER TABLE의 사용을 지원한다.

 

ALTER TABLE 테이블 이름 DROP FOREIGN KEY 외래키;

 

보다 자세한 내용은 14.2.6.4 "FORENGIN KEY 제약"을 참조하도록 하라.

 

여러분이 테이블 기본 character set과 모든 문자 열들(CHAR, VARCHAR,TEXT)을 새로운 character set으로 변경 하고자 한다면  다음과 같은 구문을 사용한다.

 

ALTER TABLE 테이블 이름 CONVERT TO CHARACTER SET character set 이름;

 

주의: 앞의 연산은 컬럼 값을 변환한다. 이는 여러분이 한 character set(ex. latin1)안에 하나의 컬럼을 가지고 있고 저장된 값들이 실제 다른 것들을 사용한다면 여러분이 원하는 바가 아니다. The preceding operation converts column values between the character sets. This is not what you want if you have a column in one character set (like latin1) but the stored values actually use some other, incompatible character set (like utf8). In this 이 경우 여러분은 각 컬럼에 대해 다음과 같이 해 주어야 한다.

 

ALTER TABLE 테이블 CHANGE 컬럼1 컬럼1 BLOB;

ALTER TABLE 테이블 CHANGE 컬럼1 컬럼1 TEXT CHARACTER SET utf8;

 

위와 같이 작업 해야 하는 이유는 여러분이 BLOB 컬럼들로 부터 혹은 BLOB 컬럼들로 변환 하려 할때 변환이 이루어지지 않기 때문이다.

 

여러분이 CONVERT TO CHARACTER SET binary로 명시 하면, CHAR, VARCHAR그리고 TEXT 컬럼들은 그것들과 대응되는 바이너리 string 타입들로 변환 된다(BINARY, VARBINARY, BLOB). 이는 컬럼들이 더이상 character set을 가지지 않게 되며 CONVERT TO연산이 적용되지 않게 됨을 의미한다.

 

반응형