http://www.mysqlkorea.co.kr
한글매뉴얼 5.0 , 한글매뉴얼 5.1 , MySQL 5.1 HA , 사용자매뉴얼
한글매뉴얼 5.0  
한글매뉴얼 5.1  
MYSQL 5.1 HA  
사용자매뉴얼  
영문매뉴얼  
최신글
mysql my파일과 …
mysql server 설…
Can't open and l…
듀얼마스터 구성 …
PREPARE 사용시 …
 
한글매뉴얼 5.0 > 매뉴얼존 > 한글매뉴얼 5.0
 

13.1.5. CREATE TABLE

 

13.1.5.1. 암묵적 컬럼 지정 변경

 

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
 
    [(create_definition,...)]
 
    [table_options] [select_statement]

 

이나

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name


      [(] LIKE old_tbl_name [)];

 

생성 정의:

    컬럼 정의

| [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
 
  | KEY [index_name] [index_type] (index_col_name,...)
 
  | INDEX [index_name] [index_type] (index_col_name,...)
 
  | [CONSTRAINT [symbol]] UNIQUE [INDEX]
 
        [index_name] [index_type] (index_col_name,...)
 
  | [FULLTEXT|SPATIAL] [INDEX] [index_name] (index_col_name,...)
 
 | [CONSTRAINT [symbol]] FOREIGN KEY
 
        [index_name] (index_col_name,...) [reference_definition]
 
 | CHECK (expr)
 

 

컬럼 정의:

col_name type [NOT NULL | NULL] [DEFAULT default_value]
 
        [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]
 
        [COMMENT 'string'] [reference_definition]

  

타입:

  
TINYINT[(length)] [UNSIGNED] [ZEROFILL]
 
  | SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
 
  | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
 
  | INT[(length)] [UNSIGNED] [ZEROFILL]
 
  | INTEGER[(length)] [UNSIGNED] [ZEROFILL]
 
  | BIGINT[(length)] [UNSIGNED] [ZEROFILL]
 
  | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
 
  | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
 
  | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
 
  | DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]
 
  | NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]
 
  | DATE
 
  | TIME
 
  | TIMESTAMP
 
  | DATETIME
 
  | YEAR
 
  | CHAR(length) [BINARY | ASCII | UNICODE]
 
  | VARCHAR(length) [BINARY]
 
  | BINARY(length)
 
  | VARBINARY(length)
 
  | TINYBLOB
 
  | BLOB
 
  | MEDIUMBLOB
 
  | LONGBLOB
 
  | TINYTEXT [BINARY]
 
  | TEXT [BINARY]
 
  | MEDIUMTEXT [BINARY]
 
  | LONGTEXT [BINARY]
 
  | ENUM(value1,value2,value3,...)
 
  | SET(value1,value2,value3,...)
 
  | spatial_type
 
index_col_name:

col_name [(length)] [ASC | DESC]

reference_definition:
    REFERENCES tbl_name [(index_col_name,...)]
               [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
               [ON DELETE reference_option]
               [ON UPDATE reference_option]
 
reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION
table_options: table_option [table_option] ...
table_option:
{ENGINE|TYPE} [=] engine_name
 
  | AUTO_INCREMENT [=] value
 
  | AVG_ROW_LENGTH [=] value
 
  | [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]
 
  | CHECKSUM [=] {0 | 1}
 
  | COMMENT [=] 'string'
 
  | CONNECTION [=] 'connect_string'
 
  | MAX_ROWS [=] value
 
  | MIN_ROWS [=] value
 
  | PACK_KEYS [=] {0 | 1 | DEFAULT}
 
  | PASSWORD [=] 'string'
 
  | DELAY_KEY_WRITE [=] {0 | 1}
 
  | ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
 
  | UNION [=] (tbl_name[,tbl_name]...)
 
  | INSERT_METHOD [=] { NO | FIRST | LAST }
 
  | DATA DIRECTORY [=] 'absolute path to directory'
 
  | INDEX DIRECTORY [=] 'absolute path to directory'
 
select_statement:

[IGNORE | REPLACE] [AS] SELECT ...   (Some legal select statement)

 

 

CREATE TABLE 주어진 이름으로 테이블을 생성한다. 여러분은 테이블에 대한 생성 권한을 가지고 있어야 한다.

 

테이블 이름 지정에 관한 규칙은 9.2 장 "데이타베이스, 테이블, 인덱스, 컬럼, 별칭 이름" 부분을 참조한다. 기본적으로 테이블은 기본 데이타 베이스 안에서 생성된다. 기본 데이타베이스가 없거나 테이블이 존재 하는 경우 에러를 발생 시킨다.

 

테이블 이름은 특정 데이터베이스안에 테이블을 생성 하기 위해서는 데이터베이스 이름.테이블 이름 으로 명시 할 수 있다. 이 작읍은 기본 데이타베이스의 존재 와 관계없이 수행된다. 인용 식별자들을 사용할 경우에는 데이터베이스와 테이블 이름을 개별적으로 인용 문을 사용하도록 한다. 예를 들자면, 'mydb.mytbl'이 아니라 'mydb'.'mytble'로 표기 해야 한다.

 

테이블을 생성할 경우 TEMPORARY 키워드를 사용 할 수 있다. TEMPORARY 테이블은 현제 연결에서만 볼 수 있고 연결이 닫힐때 자동으로 삭제 된다. 이것은 두개의 서로 다른 연결이 같은 이름의 임시 테이블 혹은 비 임시 테이블이건 간에 충돌 없이 사용할 수 있음을 의미한다(기존 테이블은 임시 테이블이 삭제 될때까지 보여지지 않는다). 여러분이 임시 테이블을 생성 하기 위해서는 CREATE TEMPORARY TABLES 권한을 가지고 있어야 한다.

 

IF NOT EXISTS 키워드는 테이블이 존재하는 경우 발생하게될 에러를 방지 해 준다. 그러나 CREATE TABLE 문에 의해 명시것과 같이 같은 구조를 가지는 테이블이 존재하는 것에 대한 검증은 하지 않는다.

주의: CREATE TABLE... SELECT 문에서 IF NOT EXISTS 문을 사용할 경우 SELECT에 의해 선택된 레코드들은 테이블이 이미 존재 하는 경우라도 삽입 된다.

 

MySQL은 데이터베이스 디렉토리 안에 하나의 .frm(정의)포맷으로 각 테이블을 표현 한다. 테이블을 위한 저장 엔진은 다른 파일들도 생성 한다. MyISAM 테이블의 경우, 저장 엔진은 데이타와 인덱스 파일들을 생성한다. 따라서 각 MyISAM 테이블에 대해서는 세개의 디스크 파일들이 존재 한다.

 

File

Purpose

tbl_name.frm

테이블 포맷 (정의)파일

tbl_name.MYD

데이터 파일

tbl_name.MYI

인덱스 파일

 

 

14장 "저장 엔진과 테이블 타입"에서는 저장 엔진이 테이블을 표현 하기 위해 사용하는 각 파일들에 대해 설명한다.

 

타입은 데이터 타입이 컬럼 정의라는 것을 표현 한다. 공간 타입(spatial type)은 공간 데이터 타입을 표현한다. 데이터 타입들의 속성에 관한 일반적인 정보는 11장 "데이터 타입" 부분을 참조 하라. 공간 데이터 타입(spatial data type)에 관한 보다 자세한 내용은 16장 "공간 확장(Spatial Extension)"부분을 참조 하라.

 

l          NULL혹은 NOT NULL이 명시 되지 않았다면 컬럼은 NULL이 명시 된것으로 간주 한다.

 

l                      하나의 정수 컬럼은 추가적으로 AUTO_INCREMENT 속성을 가질 수 있다. 여러분이 AUTO_INCREMENT 인덱스 컬럼의 값을 NULL 혹은 0으로 입력 하면 그 컬럼은 다음 일련 번호 값으로 설정된다. 일반적으로 이 것은  value + 1 로 되며 테이블의 컬럼 값 중 가장 큰 값이 된다. AUTO_INCREMENT 일련번호는 1부터 시작한다.

 

하나의 레코드를 삽입 한 후에 AUTO_INCREMENT 값을 받기 위해서는 LAST_INSERT_ID() SQL 함수나 C API 함수인 mysql_insert_id() 를 사용하라. 이에 대한 내용은 12.9.3장 "정보 함수들"부분과 22.2.3.36 장 "mysql_insert_id()" 부분을 참조하라.

 

NO_AUTO_VALUE_ON_ZERO SQL 모드가 동작 하면, 새로운 일련 번호를 생성하지 않은채 0으로 AUTO_INCREMENT 컬럼들에 저장 할 수 있다. 이에 대한 내용은 5.2.5장 "서버 SQL 모드" 부분을 참조한다.

 

주의: 테이블당 단지 하나의 AUTO_INCREMENT 컬럼이 있을 수 있고 인덱싱 되어야 하며 DEFAULT 값을 가질 수 없다. 하나의 AUTO_INCREMENT 컬럼은 양수를 가질 경우에만 올바르게 작동한다. 음수의 삽입은 매우 큰 양수를 입력 한 것으로 간주 된다. 이는 숫자들이 양수가 음수로 뒤바뀔 때 정확성 문제를 피하고 여러분이 0을 포함하고 있는 AUTO_INCREMENT 컬럼을 가질수 있는 상황을 피하기 위한 것이다.

 

MyISAM 와 BDB 테이블들에 대해 다수 컬럼 키안에서 AUTO_INCREMENT 2차 컬럼을 지정할 수 있다. 3.6.9장 "AUTO_INCREMENT 사용"부분을 참조하라.

 

MySQL을 ODBC 응용 프로그램과 호환성을 갖도록 하기 위해서는 다음 질의로 가장 마지막에 삽입된 AUTO_INCREMENT 값을 찾을수 있다.

 

SELECT * FROM 테이블 이름 WHERE 자동 증가 컬럼 IS NULL

 

l                      SERIAL의 속성은 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 에 대한 별칭이다..

 

l                      자형(CHAR, VARCHAR, TEXT)은  컬럼에 대한 문자 집합과 정렬을 지정하기 위한 CHARACTER SET 과 COLLATE 속성들을 포함 할 수 있다. 자세한 사항은 10장 "문자 집합 지원"부분을 참조하라. CHARSET은 CHARACTER SET과 동의어이다.

 

CREATE TABLE 테이블 (컬럼 CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);

 

MySQL 5.0은 문자 컬럼 정의에서 길의 명시를 문자열들로 해석한다. (MySQL 4.1 이전 버넌에서는 byte로 해석했다)

 

l                      DEFAULT 문은 컬럼에 대한 기본 값을 지정한다. 한가지 예외로 기본 값은 제약 조건이 되어야만 한다. 즉 이것은 함수나 표현식이 될수 없다. 이것은 여러분이 NOW()나 CURRENT_DATE 와 같은 함수의 값으로 날짜 컬럼의 기본값으로 설정 할 수 없다는 의미이다. 예외적으로 TIMESTAMP컬럼에 대한 기본 값으로 CURRENT_TIMESTAMPA를 지정 할 수 있다. 11.3.1.1장 "MySQL 4.1의 TIMESTAMP 속성"부분을 참조하라.

 

컬럼 정의가 DEFAULT 값을 포함하지 않는다면 MySQKL은 11.1.4장 " 테이터 형과 기본 값"부분에서 기술된 기본 값으로 설정한다.

 

BLOB TEXT 컬럼들은 기본 값으로 할당될 수 없다.

 

l                      컬럼에 대한 주석은 COMMENT 옵션으로 지정될 수 있다. 주석은 SHOW CREATE TABLE SHOW FULL COLUMNS 문에서 보여진다.

 

l                      KEY 보통 INDEX 와 같은 의미를 갖는다. PRIMARY KEY 속성은 컬럼 정의에서 KEY로서 명시 지시 될 수 있다. 이는 다른 데이터베이스 시스템들과의 호환성을 위해 구현되었다.

 

l                      UNIQUE 덱스는 인덱스 안의 모든 값들이 유일 해야 한다는 것과 같은 제약 조건을 생성 한다. 여러분이 현재 존재 하는 레코드와 매치 되는 키로 새로운 레코드를 추가 하려하면 에러를 발생 시킨다. 이 예외는 인덱스의 컬럼이 NULL 값의 포함이 허락 될 경우 다수 NULL 값을 포함 할 수 있다. 이 예외는 BDB 테이블 에서는 적용 되지 않는데 UNIQUE 인덱스를 가진 컬럼이 단 하나의 NULL 값만을 허용 하기 때문이다.

 

l                      PRIMARY KEY 모든 키 컬럼들이 NOT NULL로 정의 되어야 할때 유일한 인덱스 이다. 이들이 NOT NULL로 명시적으로 선언되지 않으면 MySQL은 암시적으로 선언 하게 된다. 하나의 테이블은 오직 하나의 PRIMARY KEY를 가질 수 있다. 여러분이 PRIMARY KEY 를 갖지 않은 상태에서 응용 프로그램이 그 테이블의 PRIMARY KEY에 관해 질의를 할 경우, MySQL은 PRIMARY KEY 로서 NULL 값을 갖지 않는 컬럼을 UNIQUE 덱스로 리턴한다.

 

InnoDB 테이블에서PRIMARY KEY는 공간을 낭비 하게 된다 (이에 대한 내용은 14.2.13 장 " PRIMARY KEY 테이블 과 인덱스 구조" 부분을 참조하라).

 

l                      생성된 테이블에서 PRIMARY KEY 가 최우선에 위치하고 그담으로 UNIQUE 인덱스들이 그다음이 non- UNIQUE 인덱스들이 위치한다. 이는 MySQL 최적기(optimizer)가 어떤 인덱스를 사용하고 중복된 UNIQUE 키들을 좀더 빨리 찾기 위해 우선 순위를 매겨놓는데 도움을 준다.

 

l                      PRIMARY KEY 는 다수 컬럼 인덱스가 될 수 있다. 그러나 여러분이 컬럼 지정에서 PRIMARY KEY 속성을 사용하여 다수 컬럼 인덱스를 생성 할 수는 없다. 단일 컬럼을 PRIMARY로 명시하는 것만 가능하다. 여러분은 개별 PRIMARY KEY (인덱스 컬럼 이름, ...)문을 사용해야 한다.

 

l                      PRIMARY KEY 나 UNIQUE 인덱스는 정수형으로 된 하나의 컬럼 으로 이루어지며 여러분은  SELECT 문에서 _rowid로서 그 컬럼을 참조 할 수 있다.

 

MySQL에서 PRIMARY KEY 의 이름은 PRIMARY이다. 다른 인덱스들에 대해서는 이름을 지정하지 않으면 그 인덱스는 첫 인덱싱된 컬럼과 같은 이름으로 지정되는데 유일하게 만들기 위해서 _2 혹은 _3 과 같이 접미어를 붙이기도 한다. 여러분은 SHOW INDEX FROM tbl_name 을 사용하여 인덱스 이름들을 볼 수 있다. 이에 대한 내용은 13.5.4.13장 "SHOW INDEX"를 참조하라.

 

몇몇 저장 엔진들은 인덱스를 생성할때 인덱스 타입을 명시 하도록 하기도 한다. 인덱스 타입 지정자에 대한 문법은 USING 타입 이름 이다.

 

예:

  

CREATE TABLE lookup

  (id INT, INDEX USING BTREE (id))

  ENGINE = MEMORY;

 

USING에 대한 자세한 내용은 13.1.4 장 "CREATE INDEX" 부분을 참조하라.

 

MySQL이 어떻게 인덱스들을 사용하는지에 대한 보다 자세한 사항은 7.4.5장 "MySQL의 인덱스 사용법" 부분을 참조하라.

 

l                      MySQL 5.0에서는 오직 MyISAM, InnoDB, BDB, MEMORY 저장 엔진들만이 NULL값을 가질 수 있는 컬럼들에게 인덱스를 지원한다. 다른 경우에는 인덱스 컬럼들에 대해서는 NOT NULL로 선언 해야 한다. 그렇지 않을 경우 에러를 리턴한다.

 

l                      인덱스 지정에서 컬럼 이름(길이) 문을 사용하여 여러분은 한 컬럼의 일 부분만을 사용하는 인덱스를 생성 할 수 있다. 인덱스 엔트리는 CHAR 와 VARCHAR 형의 컬럼들에 대해 각 컬럼 값에서 길이 만큼의 문자열들이나 BINARY VARBINARY 형의 컬럼들에 대해서 각 컬럼의 첫 길이만큼의 byte들로 이루어진다. 이와 같이 컬럼 값들의 접두어(prefix)의 인덱싱은 인덱스 파일을 훨씬 작게 할 수 있다. 7.4.3 장 "컬럼 인덱스" 부분을 참조하라.

 

MyISAM, BDB 과 InnoDB 저장 엔진은 BLOB 와 TEXT 컬럼에서 인덱싱을 지원하므로 여러분은 인덱스의 길이를 명시 해야 한다.

예를 들면:

 

CREATE TABLE test (컬럼이름 BLOB, INDEX(컬럼 이름(10)));

 

Prefixes들은 최대 1000 바이트 길이까지 가능 하다(InnoDB 테이블인 경우 767 byte). Prefix 제한들은 byte로 측정되나 CREATE TABLE 문에서 prefix길이는 비 바이너리형(CHAR, VARCHAR, TEXT)들에 대한 문자열의 수로 해석 된다.  다수 바이트 문자열 모음(character set)을 사용하는 컬럼에 대해서는 prefix길이을 지정할때 유의 해야 한다.

 

l         인덱스 컬럼 이름 지정은 ASC 나 DESC로 끝날 수 있다. 이들 키워드들은 오름순 혹은 내림순 인덱스 값 저장을 지정할때 사용하기 위한 것들이다. 현재는 이들이 분석되지만 무시되는 상태이며 이는 곧 모든 인덱스 값들은 항상 오름순 으로 저장 됨을 의미한다.

 

l         여러분이 SELECT에서 TEXT 혹은 BLOB 형 컬럼에 대해 ORDER BY나 GROUP BY를 사용할 경우, 서버는 최대 정렬 길이 시스템 변수들에 의해 지정된 바이트들의 처음 숫자를 사용하여 값들을 정렬 한다. 이에 대한 자세한 내용은 11.4.3장 "BLOB 와 TEXT형" 부분을 참조하라.

 

l         사용자는 특별한 FULL TEXT 인덱스들을 생성 할수 있는데 이들은 전체 텍스트 검색에 사용된다. MyISAM저장 엔진만이 이 FULL TEXT 인덱스를 지원한다. 이 인덱스들은 CHAR, VARCHAR 과 TEXT 컬럼들로 부터 생성 될 수 있다. 인덱싱은 전체 컬럼에 대해 항상 발생 하며 부분 인덱싱은 지원 되지 않으며 prefix길이가 명시된 경우 이는 무시 된다. 이에 대한 사항은 12.7 "전체 텍스트 검색 함수" 부분을 참조 하라.

 

l         사용자는 공간 데이터 형으로 SPATIAL 인덱스를 생성 할 수 있다. 공간형들은 MyISAM 테이블들에서만 지원 되며 인덱스 컬럼들은 NOT NULL로 선언 되어야 한다. 이에 대한 사항은 16장 "Spatial 확장" 부분을 참조하라.

 

l         InnoDB테이블은 외래 키 제약 조건에 대한 확인을 제공한다. 14.2장 "InnoDB 저장 엔진"부분에 이에 대한 내용이 있다. InnoDB에서 FOREIGN KEY는 이 부분의 시작부에 CREATE TABLE문에 나타난 것보다 제한적이다. 참조 테이블의 컬럼들은 항상 명시적으로 명명 되어야 하며 InnoDB는 ON DELETE와 ON UPDATE 적용을 외래키들에 대해 제공한다. 자세한 사항은 14.2.6.4장 "FOREIGN KEY 제약 사항" 부분을 참조하라.

 

다른 저장 엔진들에 대해서는 MySQL서버가 CREATE TABLE 문에서 FOREIGN KEY와 REFERENCE문은 분석하나 무시 한다. CHECK문은 모든 저장 엔진에 의해 무시 되며 1.9.5.5장 "외래키" 부분을 참조 하라.

 

l                      MyISAM 테이블의 경우, NULL 컬럼은 최근접 바이트로 반올림하는 하나의 엑스트라 비트(bit)를 가진다. 최대 열의 바이트 길이는 다음과 같이 계산할 수 있다.  

레코드 길이 = 1

             + (컬럼 길이의 합)

             + (NULL 컬럼의 수 + delete_flag + 7) /8

             + (가변길이 컬럼의 수)

 

delete_flag 는 고정 레코드 포멧을 가진 테이블에 대해 1값을 갖는다. 고정 테이블은 레코드가 삭제 되었는지 나타내는 플래그로 레코드에서 한 bit를 사용한다.  동적 테이블에 대해서는 이 플래그가 동적 레코드 헤더에 저장 되므로 0 값을 가진다.

 

위의 식은 저장 크기가 NOT NULL 컬럼 보다는 NULL 컬럼들에 대해서 차이가 없으므로 InnoDB 테이블에 적용되지는 않는다.

 

ENGINE 테이블 옵션은 테이블을 위한 저장 엔진을 지정한다. TYPE이 동의어 이나 ENGINE 이 주로 사용되는 옵션 이름이다.

 

ENGINE 테이블 옵션은 다음 테이블에서 보여지는 바와 같이 저장 엔진 이름을 갖는다.

 

Storage Engine

설명

ARCHIVE

archive 저장 엔진 14.8장 "ARCHIVE 저장 엔진"부분을 참조하라.

BDB

페이지 잠금을 통한 트랜잭션 안전 테이블. BerkeleyDB로 알려져 있음. 14.5장 "BDB(BerkelyDB)저장엔진"부분을 참조하라.

CSV

콤마로 구분되는 값 포맷으로 레코드를 저장하는 테이블들. 14.9장 "CSV 저장 엔진"을 참조하라..

EXAMPLE

예제 엔진. 14.6장 "EXAMPLE 저장 엔진"을 참조하라..

FEDERATED

원격 테이블들에 접근하는 저장 엔진. 14.7장 "FEDERATED 저장 엔진"을 참조하라.

HEAP

MEMORY와 동의어

ISAM (OBSOLETE)

MySQL 5.0에서는 불가능. 이전 버전에서 MySQL 5.0으로 DB를 업그레이드 할 경우 ISAM 테이블을 MyISAM으로 변환하여야 한다.

InnoDB

레코드 잠금과 외래키를 가진 트랜잭션 안전 테이블. 14.2장 "InnoDB 저장 엔진" 부분을 참조 하라.

MEMORY

이 저장 엔진의 데이터는 메모리에 저장 된다. 14.4 장 "MEMORY(HEAP) 저장 엔진"부분을 참조 하라..

MERGE

MyISAM 테이블들이 하나의 테이블로 사용된다. MRG_MyISAM으로 알려져 있다. 14.3장 "MERGE 저장 엔진"부분을 참조하라.

MyISAM

MySQL에 의해 사용되는 기본 저장 엔진으로 binary portable 엔진임. 14.1장 "MyISAM 저장 엔진"을 참조하라..

NDBCLUSTER

클러스터되고 무정지의 메모리 기반 테이블들. NDB로 알려짐. 15장 "MySQL Cluster"를 참조하라.

 

 

저장 엔진이 불가능 하다고 명시 되어 있다면 MySQL은 기본 엔진을 대신 사용한다. 예로서 한 테이블 정의가 ENGINE=BDB 옵션을 포함하고 MySQL 서버가 BDB 테이블을 지원하지 않는다면 이 테이블은 MyISAM 테이블로 생성된다. 이는 마스터에 트랜잭션 테이블을 가지고 있지만 slave로 생성된 테이블들은 비 트랜잭션적인(속도를 높이기 위해) 곳에서 치환 설정을 가능 하게 한다. MySQL 5.0에서는 저장 엔진 지정이 불가능 한경우 경고를 발생 시킨다.

 

다른 테이블 옵션들은 테이블의 행위를 최적화 하기 위해 사용된다. 대부분의 경우 여러분은 그들의 일부를 지정해야 한다. 이들 옵션들은 모든 저장 엔진에 적용 된다.

 

l                      AUTO_INCREMENT

 

테이블에서 AUTO_INCREMENT 값의 이니셜이다. MySQL 5.0에서 이것은 MyISAM과 MEMORY 테이블들로 작동한다. 이것은 또한 MySQL 5.0.3에서 처럼 InnoDB를 위해 지원된다. AUTO_INCREMENT 테이블 옵션을 지원하지 않는 엔진들에 대해 자동 증가 값을 설정 하기 위해서는 테이블 생성후 원하는 값보다 1적은 값으로 "dummy"레코드에 삽입 한 다음 그 "dummy"레코드를 삭제 한다.

 

CREATE_TABLE문에서 AUTO_INCREMENT 테이블 옵션을 제공하는 엔진들에 대해 여러분은 AUTO_INCREMENT 값을 재 설정 하기 위해서 ALTER TABLE 테이블 이름  AUTO_INCREMENT = N 으로 설정 할 수 있다.

 

l                      AVG_ROW_LENGTH

 

테이블의 평균 레코드 길이의 근사값이다. 여러분은 가변 크기의 레코드들을 가진 큰 테이블들에 대해서만 설정 할 필요가 있다.

 

MyISAM 테이블을 생성 할때 MySQL은 결과 테이블이 얼마나 큰지를 결정하기 위해서 MAX_ROWS와 AVG_ROW_LENGTH옵션의 결과를 사용한다. 여러분이 만약 어떤 옵션도 지정하지 않으면 테이블의 최대 크기는 65,536TB 이다 (MySQL 5.0.6 이전 버전에서는 4GB였다.). (만약 여러분의 운영 체제가 이정도 크기의 파일을 지원하지 않는다면 테이블 크기는 파일 크기 제약에 의해 제한 받는다.) 여러분이 인덱스를 작게 하거나 빠르게 하고 싶고 실제 큰 파일이 필요하지 않다면 myisam_data_pointer_size 시스템 변수를 설정하여 기본 크기를 줄일 수 있다. 이것은 MySQL 4.1.2 버전에서 추가 되었다. (5.2.2.2장 "서버 시스템 변수"부분을 참조하라). 여러분이 모든 테이블을 기본 제한 값보다 크게 만들고 약간 느려지게 하고자 한다면 이 값의 설저을 변경 하여 증가 시킬 수 있다.

 

l                      [DEFAULT] CHARACTER SET

 

테이블의 기본 문자 모음(character set)을 지정한다. CHARSET은 CHARACTER SET과 동의어이다.

 

l                      COLLATE

 

테이블의 기본 정렬 방법을 지정한다.

 

l                      CHECKSUM

 

MySQL 모든 레코드들에 대해서 checksum을 유지 하고 싶다면 이것을 1로 설정하라(MySQL이 테이블이 변경되면 자동으로 업데이트 한다.). 이것은 테이블의 업데이트를 다소 느리게 만들지만 깨진 테이블을 쉽게 찾도록 하기도 한다. CHECKSUM TABLE 문은 checksum을 보고 한다.(MyISAM 만 해당)

 

l                      COMMENT

 

테이블의 주석으로 최대 60자까지 남길 수 있다.

 

l                      CONNECTION

 

FEDERATED 테이블을 위한 연결 문자열이다. 이 옵션은 MySQL 5.0.13부터 가능 하다. 그전에는 COMMENT 옵션을 사용한다.

 

l                      MAX_ROWS

 

테이블에 저장하려는 레코드의 최대 수이다. 이것은 고정된 제한 값이 아니라 테이블이 최소 이 정도의 레코드들 저장 할 수 있어야 한다는 것을 지정하는 것이다.

 

l                      MIN_ROWS

 

테이블에 저장하려는 레코드의 최소 수이다.

 

l                      PACK_KEYS

 

PACK_KEYS은 MyISAM 테이블에서 효과를 지닌다. 작은 인덱스들을 원한다면 이 옵션을 1로 설정 하라. 이것은 보통 업데이트를 느리게 하고 읽기를 빠르게 만든다. 옵션을 0으로 하면 키들의 모든  패킹(packing)을 불가능 하게 한다. 이 값을 DEFAULT로 하면 저장엔진이 CHAR나 VARCHAR 컬럼들만 동반 할 수 있다.

 

여러분이 PACK_KEYS를 사용하지 않으면 기본적으로 숫자가 아닌 문자열을 패킹한다. PACK_KEYS=1로 하면 숫자들로 pack될 수 있다.

 

바이너리 숫자 키를 pack할때 MySQL은 prefix 압축을 사용한다.

 

l         모든 키는 이전 키의 얼마나 많은 byte들이 다음 키와 동일 할 것인지를 가리키는 하나의 byte를 필요로 한다.

 

l         레코드 포인터는 압축을 향상 시키기 위해 키 다음 바로 높은 byte가 먼저 오는 방식으로 저장된다.

 

이것은 여러분이 두개의 연속 적인 레코드에 많은 동일한 키들을 가지 있다면 모든 다음의 "same"키들은 단지 2바이트 만을 갖는다(레코드에 대한 포인터 포함). 일반 적인 경우 키들은 각 키의 저장 크기 + 포인터 크기(포인터 크기는 4byte 이다) 를 갖는다. 여러분은 동일 한 값을 갖는 키가 많을 경우  prefix 압축으로 부터 많은 잇접을 얻게 된다. 만약 모든 키들이 다르다고 이때 그 key가 NULL값을 갖지 않는다면, 여러분은 각 key당 1 byte를 더 사용한다.(이 경우 pack된 key 길이는 key가 NULL이면 표기 하는데 사용되는 같은 byte에 저장 된다.)

 

l                      PASSWORD

 

.frm 파일을 password로 암호화한다. 이 옵션은 표준 MySQL 버전에서 동작 하지 않는다.

 

l                      DELAY_KEY_WRITE

 

테이블이 닫힐 때까지 테이블의 키 업데이트를 지연 시키려 할때 이를 1로 설정한다. 5.2.2장 "서버 시스템 변수"에서 지연 키 쓰기 시스템 변수의 설명을 참조 하라.(MyISAM만 해당)

 

l                      ROW_FORMAT

 

레코드들이 어떻게 저장 되어야 하는지 정의한다. MyISAM 테이블에 대해 옵션 값은 고정 혹은 가변 길이 레코드 포맷에서 FIXED혹은 DYNAMIC 으로 될 수 있으며 myisampack은 그 형을 COMPRESSED로 설정 한다. 14.1.3 "MyISAM 테이블 저장 포맷"을 참조 하라.

 

InnoDB 테이블에 대해 MySQL 5.0.3에서 레코드들이 기본적으로 compact 포맷으로 저장 된다(ROW_FORMAT = COMPACT). 이전 버전의 MySQL에서 사용된 비 compact 포맷은 ROW_FORMAT=REDUNDANT 로 지정하여 요구 되어질 수 있다.

 

l                      RAID_TYPE

 

RAID는 MySQL 5.0에서는 삭제 되었다. 홈페이지 http://dev.mysql.com/doc/refman/4.1/en/create-table.html를 참조하라.

 

l                      UNION

 

UNION은 여러분이 MyISAM테이블들을 모음을 접근 하려 할 대 사용된다. 이것은 단지 MERGE 테이블들에 대해서만 작동 한다. 14.3장 "MERGE 저장 엔진" 부분을 참조 하라.

 

여러분은 테이블들을 하나의 MERGE 테이블로 매핑 하려면 SELECT, UPDATE, DELETE 권한을 가져야 한다. ( 주의 : 형식적으로 모든 테이블은 MERGE 테이블과 같은 데이터베이스 안에 있어야 한다. 이 제약은 더이상 적용 되지 않는다)

 

l                      INSERT_METHOD

 

MERGE 테이블에 데이타를 삽입 하려면 레코드가 삽입될 테이블에 INSERT_METHOD를 명시 해야 한다. INSERT_METHOD는 MERGE테이블에 대해서만 유용한 옵션이다. 테이블의 처음 이나 끝부분에 삽입을 하려면 FIRST나 LAST를 사용한다 NO의 값은  삽입을 못하게 한다. 자세한 사항은 14.3장 "MERGE 저장 엔진"부분을 참조 하라.

 

l                      DATA DIRECTORY, INDEX DIRECTORY

 

DATA DIRECTORY='디렉토리' 나  INDEX DIRECTORY='디렉토리'는 MyISAM 저장 엔진이 테이블의 데이타 파일이나 인덱스 파일을 어디에 저장 할지를 지정한다. 디렉토리는 상대 경로가 아닌 절대 경로이어야 한다.

 

이들 옵션들은 여러분이 --skip-symbolic-links 옵션을 사용하지 않는한 적용된다. 여러분의 운영 시스템이 쓰레드 안전 realpath() 호출을 해야 한다. 자세한 사항은 7.6.1.2장 "Unix에서 테이블을 위한 Symbolic Links사용" 부분을 참조 하라.

 

CREATE TABLE문의 끝부분에 SELECT문을 추가 하여 다른 하나의 테이블을 생성 할 수 있다.

 

CREATE TABLE 새 테이블 SELECT * FROM 원본 테이블;

 

MySQL은 SELECT에서 모든 요소들의 신규 컬럼들을 생성 한다.

예:

 

mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT,

    ->        PRIMARY KEY (a), KEY(b))

    ->        ENGINE=MyISAM SELECT b,c FROM test2;

 

이것은 새개의 컬럼 a,b와 c를 가지는 MyISAM 테이블을 생성하는 명령이다. 여기서 SELECT문에 있는 컬럼들은 테이블의 오른쪽에 추가 되며 그것에 겹쳐지지 않는다. 다음과 같은 예를 보면;

 

mysql> SELECT * FROM foo;

+---+
| n |

+---+

| 1 |

+---+

 

mysql> CREATE TABLE bar (m INT) SELECT n FROM foo;

Query OK, 1 row affected (0.02 sec)

Records: 1  Duplicates: 0  Warnings: 0

 

mysql> SELECT * FROM bar;

+------+---+

| m    | n |

+------+---+

| NULL | 1 |

+------+---+

1 row in set (0.00 sec)

 

테이블 foo의 각 레코드에 대해,  foo 테이블로 부터의 값들과 새로운 컬럼들에 대한 기본값들로 이루어지는 하나의 레코드가 bar 테이블에 삽입 된다.

 

CREATE TABLE ... SELECT 결과로 테이블안에는 , CREATE TABLE부분에 명명된 커럼들이 우선한다. SELECT 컬럼s 의 데이타형은 CREATE TABLE 부분에서 그 컬럼을 지정 하여 바뀌어 질 수 있다.

 

데이타를 테이블에 복사하는 동안 에러가 발생하면 자동으로 삭제 하고 테이블은 생성 되지 않는다.

 

CREATE TABLE ... SELECT 은 자동으로 어떤 인덱스도 생성 하지 않는다. 이것은 의도적으로 그 문장을 유연하게 만들기 위해 이루어지는 것이다. 여러분이 생성된 테이블에 인덱스를 지정하길 원한다면 SELECT문 이전에 이것들을 명시 하도록 한다.

 

mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;

 

데이타형의 변환도 발생 할 수 있다. 예를 들면 AUTO_INCREMENT 속성이 보존되지 않으면 VARCHAR 컬럼은 CHAR 컬럼이 될 수 있다.

 

CREATE...SELECT 문으로 테이블 생성시, 질의 에서 함수 호출에 대한 별칭 지정을 확실히 하도록 하라. 그렇지 않으면 CREATE 문은 올바르지 않은 컬럼 이름에 대해서 실패 할 수도 있다.

 

   CREATE TABLE artists_and_works

  SELECT artist.name, COUNT(work.artist_id) AS number_of_works

  FROM artist LEFT JOIN work ON artist.id = work.artist_id

  GROUP BY artist.id;

 

여러분은 또한 생성된 컬럼에 대한 데이타 타입을 명시적으로 지정 할 수 있다.

 

CREATE TABLE foo (a TINYINT NOT NULL) SELECT b+1 AS a FROM bar;          

 

원본 테이블에서 정의된 컬럼 속성과 인덱스들을 포함 하는 다른 테이블의 정의를 기반으로 빈 테이블을 생성 하려면 LIKE를 사용하도록 하라. 

 

CREATE TABLE new_tbl LIKE orig_tbl;

 

CREATE TABLE ... LIKE 원본 테이블에서 지정되었던 어떤  DATA DIRECTORY INDEX DIRECTORY 테이블 옵션이나 외래키 정의들을 유지 하지 않는다.

 

유일키 값이 중복되는 레코드를 어떻게 처리 할지 지시 하기 위해 IGNORE 와 REPLACE를 선행 시킬수 있다. IGNORE를 사용하면 중복된 레코드는 삭제 된다. REPLACE를 사용하는 경우 새로운 레코드들은 같은 유일 키 값을 갖는 레코드로 대채 된다. IGNORE 와 REPACE 모두 명시 하지 않으면 중복된 유일 키에 대해서 에러를 발생 하게 된다.

 

바이너리 로그가 원본 테이블들을 재생성 하는데 사용되도록 하기 위해, MySQL은 CREATE TABLE...SELECT에 동시 삽입을 허용하지 않는다.

상위
13.1.5. CREATE TABLE
13.1.5.1. Silent Column Speci…
MySQL Korea 사이트의 컨텐츠 소유권은 (주)상상이비즈에 있으므로 무단전재를 금합니다.
ⓒ 2010-2011 ssebiz All Rights Reserved.