Loading...
MySQL 9.5 Reference Manual 9.5의 15.1.24 CREATE TABLE Statement의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
15.1.24.1 CREATE TABLE로 생성되는 Files
15.1.24.2 CREATE TEMPORARY TABLE Statement
15.1.24.3 CREATE TABLE ... LIKE Statement
15.1.24.4 CREATE TABLE ... SELECT Statement
15.1.24.5 FOREIGN KEY Constraints
15.1.24.6 CHECK Constraints
15.1.24.7 Silent Column Specification Changes
15.1.24.8 CREATE TABLE and Generated Columns
15.1.24.9 Secondary Indexes and Generated Columns
15.1.24.10 Invisible Columns
15.1.24.11 Generated Invisible Primary Keys
15.1.24.12 Setting NDB Comment Options
1CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name 2 (create_definition,...) 3 [table_options] 4 [partition_options] 5 6CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name 7 [(create_definition,...)] 8 [table_options] 9 [partition_options] 10 [IGNORE | REPLACE] 11 [AS] query_expression 12 13CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name 14 { LIKE old_tbl_name | (LIKE old_tbl_name) } 15 16create_definition: { 17 col_name column_definition 18 | {INDEX | KEY} [index_name] [index_type] (key_part,...) 19 [index_option] ... 20 | {FULLTEXT | SPATIAL} [INDEX | KEY] [index_name] (key_part,...) 21 [index_option] ... 22 | [CONSTRAINT [symbol]] PRIMARY KEY 23 [index_type] (key_part,...) 24 [index_option] ... 25 | [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY] 26 [index_name] [index_type] (key_part,...) 27 [index_option] ... 28 | [CONSTRAINT [symbol]] FOREIGN KEY 29 [index_name] (col_name,...) 30 reference_definition 31 | check_constraint_definition 32} 33 34column_definition: { 35 data_type [NOT NULL | NULL] [DEFAULT {literal | (expr)} ] 36 [VISIBLE | INVISIBLE] 37 [AUTO_INCREMENT] [UNIQUE [KEY]] [[PRIMARY] KEY] 38 [COMMENT 'string'] 39 [COLLATE collation_name] 40 [COLUMN_FORMAT {FIXED | DYNAMIC | DEFAULT}] 41 [ENGINE_ATTRIBUTE [=] 'string'] 42 [SECONDARY_ENGINE_ATTRIBUTE [=] 'string'] 43 [STORAGE {DISK | MEMORY}] 44 [reference_definition] 45 [check_constraint_definition] 46 | data_type 47 [COLLATE collation_name] 48 [GENERATED ALWAYS] AS (expr) 49 [VIRTUAL | STORED] [NOT NULL | NULL] 50 [VISIBLE | INVISIBLE] 51 [UNIQUE [KEY]] [[PRIMARY] KEY] 52 [COMMENT 'string'] 53 [reference_definition] 54 [check_constraint_definition] 55} 56 57data_type: 58 (see Chapter 13, Data Types) 59 60key_part: {col_name [(length)] | (expr)} [ASC | DESC] 61 62index_type: 63 USING {BTREE | HASH} 64 65index_option: { 66 KEY_BLOCK_SIZE [=] value 67 | index_type 68 | WITH PARSER parser_name 69 | COMMENT 'string' 70 | {VISIBLE | INVISIBLE} 71 | ENGINE_ATTRIBUTE [=] 'string' 72 | SECONDARY_ENGINE_ATTRIBUTE [=] 'string' 73} 74 75check_constraint_definition: 76 [CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED] 77 78reference_definition: 79 REFERENCES tbl_name (key_part,...) 80 [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE] 81 [ON DELETE reference_option] 82 [ON UPDATE reference_option] 83 84reference_option: 85 RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT 86 87table_options: 88 table_option [[,] table_option] ... 89 90table_option: { 91 AUTOEXTEND_SIZE [=] value 92 | AUTO_INCREMENT [=] value 93 | AVG_ROW_LENGTH [=] value 94 | [DEFAULT] CHARACTER SET [=] charset_name 95 | CHECKSUM [=] {0 | 1} 96 | [DEFAULT] COLLATE [=] collation_name 97 | COMMENT [=] 'string' 98 | COMPRESSION [=] {'ZLIB' | 'LZ4' | 'NONE'} 99 | CONNECTION [=] 'connect_string' 100 | {DATA | INDEX} DIRECTORY [=] 'absolute path to directory' 101 | DELAY_KEY_WRITE [=] {0 | 1} 102 | ENCRYPTION [=] {'Y' | 'N'} 103 | ENGINE [=] engine_name 104 | ENGINE_ATTRIBUTE [=] 'string' 105 | INSERT_METHOD [=] { NO | FIRST | LAST } 106 | KEY_BLOCK_SIZE [=] value 107 | MAX_ROWS [=] value 108 | MIN_ROWS [=] value 109 | PACK_KEYS [=] {0 | 1 | DEFAULT} 110 | PASSWORD [=] 'string' 111 | ROW_FORMAT [=] {DEFAULT | DYNAMIC | FIXED | COMPRESSED | REDUNDANT | COMPACT} 112 | START TRANSACTION 113 | SECONDARY_ENGINE_ATTRIBUTE [=] 'string' 114 | STATS_AUTO_RECALC [=] {DEFAULT | 0 | 1} 115 | STATS_PERSISTENT [=] {DEFAULT | 0 | 1} 116 | STATS_SAMPLE_PAGES [=] value 117 | tablespace_option 118 | UNION [=] (tbl_name[,tbl_name]...) 119} 120 121partition_options: 122 PARTITION BY 123 { [LINEAR] HASH(expr) 124 | [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list) 125 | RANGE{(expr) | COLUMNS(column_list)} 126 | LIST{(expr) | COLUMNS(column_list)} } 127 [PARTITIONS num] 128 [SUBPARTITION BY 129 { [LINEAR] HASH(expr) 130 | [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list) } 131 [SUBPARTITIONS num] 132 ] 133 [(partition_definition [, partition_definition] ...)] 134 135partition_definition: 136 PARTITION partition_name 137 [VALUES 138 {LESS THAN {(expr | value_list) | MAXVALUE} 139 | 140 IN (value_list)}] 141 [[STORAGE] ENGINE [=] engine_name] 142 [COMMENT [=] 'string' ] 143 [DATA DIRECTORY [=] 'data_dir'] 144 [INDEX DIRECTORY [=] 'index_dir'] 145 [MAX_ROWS [=] max_number_of_rows] 146 [MIN_ROWS [=] min_number_of_rows] 147 [TABLESPACE [=] tablespace_name] 148 [(subpartition_definition [, subpartition_definition] ...)] 149 150subpartition_definition: 151 SUBPARTITION logical_name 152 [[STORAGE] ENGINE [=] engine_name] 153 [COMMENT [=] 'string' ] 154 [DATA DIRECTORY [=] 'data_dir'] 155 [INDEX DIRECTORY [=] 'index_dir'] 156 [MAX_ROWS [=] max_number_of_rows] 157 [MIN_ROWS [=] min_number_of_rows] 158 [TABLESPACE [=] tablespace_name] 159 160tablespace_option: 161 TABLESPACE tablespace_name [STORAGE DISK] 162 | [TABLESPACE tablespace_name] STORAGE MEMORY 163 164query_expression: 165 SELECT ... (Some valid select or union statement)
CREATE TABLE은 지정된 이름(name)으로 테이블을 생성합니다. 해당 테이블에 대해 CREATE 권한(privilege)이 있어야 합니다.
기본적으로 테이블은 기본 데이터베이스(default database)에 InnoDB 스토리지 엔진(storage engine)을 사용하여 생성됩니다. 테이블이 이미 존재하는 경우, 기본 데이터베이스가 없는 경우, 또는 데이터베이스가 존재하지 않는 경우 오류(error)가 발생합니다.
MySQL은 테이블 수에 제한이 없습니다. 다만, 기반 파일 시스템(underlying file system)은 테이블을 나타내는 파일 수에 제한이 있을 수 있습니다. 개별 스토리지 엔진은 엔진별 제약(engine-specific constraints)을 부과할 수 있습니다. InnoDB는 최대 40억 개의 테이블을 허용합니다.
테이블의 물리적 표현(physical representation)에 대한 정보는 Section 15.1.24.1, “Files Created by CREATE TABLE”을 참조하십시오.
이 섹션에서 다음 주제(topic) 아래에 설명된 대로 CREATE TABLE 문(statement)에는 여러 측면이 있습니다:
tbl_name테이블 이름(table name)은 특정 데이터베이스(database)에 테이블을 생성하기 위해 db_name.tbl_name 형태로 지정할 수 있습니다. 이는 데이터베이스가 존재한다고 가정하면 기본 데이터베이스의 존재 여부와 관계없이 동작합니다.
Quoted identifier를 사용하는 경우, 데이터베이스와 테이블 이름을 각각 별도로 quote하십시오. 예를 들어 mydb`.`mytbl처럼 작성하고, mydb.mytbl처럼 작성하지 마십시오.
허용되는 테이블 이름에 대한 규칙(rules)은 Section 11.2, “Schema Object Names”에 제공되어 있습니다.
IF NOT EXISTS테이블이 존재하는 경우 오류 발생을 방지합니다. 그러나 기존 테이블(existing table)이 CREATE TABLE 문이 나타내는 것과 동일한 구조(structure)를 갖는지에 대한 검증(verification)은 없습니다.
테이블을 생성할 때 TEMPORARY 키워드를 사용할 수 있습니다. TEMPORARY 테이블은 현재 세션(current session) 내에서만 보이며(session scope), 세션이 닫힐 때 자동으로 삭제(drop)됩니다.
자세한 내용은 Section 15.1.24.2, “CREATE TEMPORARY TABLE Statement”를 참조하십시오.
LIKECREATE TABLE ... LIKE를 사용하여 원본 테이블(original table)에 정의된 모든 컬럼 속성(any column attributes) 및 인덱스(indexes)를 포함해, 다른 테이블의 정의(definition)를 기반으로 빈 테이블(empty table)을 생성합니다:
1CREATE TABLE new_tbl LIKE orig_tbl;
자세한 내용은 Section 15.1.24.3, “CREATE TABLE ... LIKE Statement”를 참조하십시오.
[AS] query_expression한 테이블을 다른 테이블로부터 생성하려면 CREATE TABLE 문 끝에 SELECT 문을 추가합니다:
1CREATE TABLE new_tbl AS SELECT * FROM orig_tbl;
자세한 내용은 Section 15.1.24.4, “CREATE TABLE ... SELECT Statement”를 참조하십시오.
IGNORE | REPLACEIGNORE 및 REPLACE 옵션(option)은 SELECT 문을 사용해 테이블을 복사할 때, 유니크 키 값(unique key values)이 중복되는 행(rows)을 어떻게 처리할지를 나타냅니다.
자세한 내용은 Section 15.1.24.4, “CREATE TABLE ... SELECT Statement”를 참조하십시오.
테이블당 컬럼 수의 하드 제한(hard limit)은 4096이지만, 특정 테이블의 유효 최대치(effective maximum)는 더 적을 수 있으며 Section 10.4.7, “Limits on Table Column Count and Row Size”에서 논의된 요인(factors)에 따라 달라집니다.
data_type_data_type_은 컬럼 정의(column definition)에서 데이터 타입(data type)을 나타냅니다. 컬럼 데이터 타입을 지정하기 위해 사용 가능한 문법(syntax)에 대한 전체 설명과 각 타입(type)의 속성(properties)에 대한 정보는 Chapter 13, Data Types를 참조하십시오.
AUTO_INCREMENT는 정수 타입(integer types)에만 적용됩니다.
문자 데이터 타입(character data types)(CHAR, VARCHAR, TEXT, ENUM, SET 및 그 밖의 동의어(any synonyms))는 컬럼의 문자셋(character set)을 지정하기 위해 CHARACTER SET을 포함할 수 있습니다. CHARSET은 CHARACTER SET의 동의어(synonym)입니다.
문자셋에 대한 콜레이션(collation)은 다른 속성과 함께 COLLATE 속성(attribute)으로 지정할 수 있습니다. 자세한 내용은 Chapter 12, Character Sets, Collations, Unicode를 참조하십시오. 예:
1CREATE TABLE t (c CHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin);
MySQL 9.5는 문자 컬럼 정의(character column definitions)의 길이 지정(length specifications)을 문자 수(characters)로 해석합니다. BINARY 및 VARBINARY의 길이(lengths)는 바이트(bytes)입니다.
CHAR, VARCHAR, BINARY, 및 VARBINARY 컬럼의 경우 col_name(length) 문법을 사용하여 인덱스 접두 길이(index prefix length)를 지정함으로써 컬럼 값의 선행 부분(leading part)만 사용하는 인덱스를 생성할 수 있습니다.
BLOB 및 TEXT 컬럼도 인덱싱될 수 있지만 접두 길이(prefix length)를 반드시 지정해야 합니다. 접두 길이는 nonbinary 문자열 타입의 경우 문자 수(characters)로, binary 문자열 타입의 경우 바이트 수(bytes)로 지정됩니다.
이렇게 컬럼 값의 접두만 인덱싱하면 인덱스 파일(index file)을 훨씬 더 작게 만들 수 있습니다. 인덱스 접두(prefix)에 대한 추가 정보는 Section 15.1.18, “CREATE INDEX Statement”를 참조하십시오.
BLOB 및 TEXT 컬럼에 대한 인덱싱은 InnoDB 및 MyISAM 스토리지 엔진만 지원합니다. 예:
1CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
지정된 인덱스 접두가 최대 컬럼 데이터 타입 크기(maximum column data type size)를 초과하는 경우 CREATE TABLE은 다음과 같이 인덱스를 처리합니다:
JSON 컬럼은 인덱싱될 수 없습니다. 이 제한(restriction)은 JSON 컬럼에서 스칼라 값(scalar value)을 추출하는 generated column에 인덱스를 생성함으로써 우회할 수 있습니다. 자세한 예는 Indexing a Generated Column to Provide a JSON Column Index를 참조하십시오.
NOT NULL | NULL
NULL 또는 NOT NULL이 어느 것도 지정되지 않은 경우, 컬럼은 NULL이 지정된 것처럼 처리됩니다.
MySQL 9.5에서 NULL 값을 가질 수 있는 컬럼에 대한 인덱스는 InnoDB, MyISAM, 및 MEMORY 스토리지 엔진만 지원합니다. 그 외에는 인덱싱되는 컬럼을 NOT NULL로 선언해야 하며, 그렇지 않으면 오류가 발생합니다.
DEFAULT컬럼의 기본값(default value)을 지정합니다. 컬럼 정의에 명시적 DEFAULT 값이 포함되지 않는 경우를 포함하여 default value 처리에 대한 자세한 내용은 Section 13.6, “Data Type Default Values”를 참조하십시오.
NO_ZERO_DATE 또는 NO_ZERO_IN_DATE SQL mode가 enabled되어 있고 date-valued default가 해당 mode에 따라 올바르지 않은 경우, CREATE TABLE은 strict SQL mode가 enabled되지 않았으면 warning을 생성하고, strict mode가 enabled되어 있으면 error를 생성합니다. 예를 들어 NO_ZERO_IN_DATE가 enabled된 상태에서 c1 DATE DEFAULT '2010-00-00'는 warning을 생성합니다.
VISIBLE, INVISIBLE컬럼 가시성(column visibility)을 지정합니다. 키워드가 둘 다 없는 경우 기본값(default)은 VISIBLE입니다. 테이블에는 적어도 하나의 visible 컬럼이 있어야 합니다. 모든 컬럼을 invisible로 만들려고 하면 오류가 발생합니다.
자세한 내용은 Section 15.1.24.10, “Invisible Columns”를 참조하십시오.
AUTO_INCREMENT정수 컬럼(integer column)은 추가 속성(attribute) AUTO_INCREMENT를 가질 수 있습니다. 인덱싱된 AUTO_INCREMENT 컬럼에 NULL(권장) 또는 0을 insert하면 컬럼은 다음 시퀀스 값(sequence value)으로 설정됩니다. 일반적으로 이는 value+1이며, 여기서 _value_는 테이블에서 현재 해당 컬럼의 가장 큰 값(largest value)입니다. AUTO_INCREMENT 시퀀스는 1에서 시작합니다.
행(row)을 insert한 후 AUTO_INCREMENT 값을 가져오려면 LAST_INSERT_ID() SQL 함수 또는 mysql_insert_id() C API 함수를 사용하십시오. Section 14.15, “Information Functions” 및 mysql_insert_id()를 참조하십시오.
NO_AUTO_VALUE_ON_ZERO SQL mode가 enabled된 경우, 새로운 시퀀스 값을 생성하지 않고 AUTO_INCREMENT 컬럼에 0을 0으로 저장할 수 있습니다. Section 7.1.11, “Server SQL Modes”를 참조하십시오.
테이블당 AUTO_INCREMENT 컬럼은 하나만 있을 수 있으며, 인덱싱되어야 하고, DEFAULT 값을 가질 수 없습니다. AUTO_INCREMENT 컬럼은 양수 값(positive values)만 포함할 때 제대로 동작합니다. 음수를 insert하는 것은 매우 큰 양수를 insert하는 것으로 간주됩니다. 이는 숫자가 positive에서 negative로 “wrap”될 때 정밀도 문제(precision problems)를 피하고, AUTO_INCREMENT 컬럼에 실수로 0이 포함되는 것을 방지하기 위해 수행됩니다.
MyISAM 테이블의 경우 multiple-column 키에서 AUTO_INCREMENT 보조 컬럼(secondary column)을 지정할 수 있습니다. Section 5.6.9, “Using AUTO_INCREMENT”를 참조하십시오.
일부 ODBC 애플리케이션(application)과 MySQL을 호환되게 만들기 위해, 다음 쿼리로 마지막으로 insert된 행의 AUTO_INCREMENT 값을 찾을 수 있습니다:
1SELECT * FROM tbl_name WHERE auto_col IS NULL
이 방법(method)은 sql_auto_is_null 변수가 0으로 설정되어 있지 않아야 합니다. Section 7.1.8, “Server System Variables”를 참조하십시오.
InnoDB와 AUTO_INCREMENT에 대한 정보는 Section 17.6.1.6, “AUTO_INCREMENT Handling in InnoDB”를 참조하십시오. AUTO_INCREMENT와 MySQL Replication에 대한 정보는 Section 19.5.1.1, “Replication and AUTO_INCREMENT”를 참조하십시오.
COMMENT컬럼에 대한 주석(comment)은 최대 1024자 길이로 COMMENT 옵션(option)으로 지정할 수 있습니다. 주석은 SHOW CREATE TABLE 및 SHOW FULL COLUMNS 문으로 표시됩니다.
또한 Information Schema COLUMNS 테이블의 COLUMN_COMMENT 컬럼에도 표시됩니다.
COLUMN_FORMATNDB Cluster에서는 COLUMN_FORMAT을 사용하여 NDB 테이블의 개별 컬럼에 대해 데이터 저장 형식(data storage format)을 지정할 수도 있습니다. 허용되는 컬럼 형식(permissible column formats)은 FIXED, DYNAMIC, 및 DEFAULT입니다.
FIXED는 고정 폭 저장(fixed-width storage)을 지정하는 데 사용되고, DYNAMIC은 컬럼이 가변 폭(variable-width)이 되는 것을 허용하며, DEFAULT는 컬럼의 데이터 타입에 의해 결정되는 대로 fixed-width 또는 variable-width 저장을 사용하게 합니다(ROW_FORMAT 지정자(specifier)에 의해 override될 수 있음).
NDB 테이블의 경우 COLUMN_FORMAT의 기본값(default value)은 FIXED입니다.
NDB Cluster에서 COLUMN_FORMAT=FIXED로 정의된 컬럼의 가능한 최대 오프셋(maximum possible offset)은 8188 bytes입니다. 자세한 내용 및 가능한 우회 방법(workarounds)은 Section 25.2.7.5, “Limits Associated with Database Objects in NDB Cluster”를 참조하십시오.
COLUMN_FORMAT은 현재 NDB 이외의 스토리지 엔진을 사용하는 테이블의 컬럼에는 효과(effect)가 없습니다. MySQL 9.5는 COLUMN_FORMAT을 조용히 무시(silently ignores)합니다.
ENGINE_ATTRIBUTE 및 SECONDARY_ENGINE_ATTRIBUTE 옵션은 primary 및 secondary 스토리지 엔진에 대한 컬럼 속성(column attributes)을 지정하는 데 사용됩니다. 이 옵션은 future use를 위해 reserved되어 있습니다.이 옵션에 할당되는 값(value)은 유효한 JSON 문서 또는 빈 문자열('')을 포함하는 문자열 리터럴(string literal)입니다. Invalid JSON은 거부(rejected)됩니다.
1CREATE TABLE t1 (c1 INT ENGINE_ATTRIBUTE='{"key":"value"}');
ENGINE_ATTRIBUTE 및 SECONDARY_ENGINE_ATTRIBUTE 값은 오류 없이 반복될 수 있습니다. 이 경우 마지막으로 지정된 값이 사용됩니다.
ENGINE_ATTRIBUTE 및 SECONDARY_ENGINE_ATTRIBUTE 값은 서버에 의해 검사(checked)되지 않으며, 테이블의 스토리지 엔진이 변경될 때 지워지지도(cleared) 않습니다.
STORAGENDB 테이블의 경우 STORAGE 절(clause)을 사용하여 컬럼이 디스크(disk)에 저장되는지 메모리(memory)에 저장되는지 여부를 지정할 수 있습니다. STORAGE DISK는 컬럼이 디스크에 저장되도록 하며, STORAGE MEMORY는 메모리 내 저장(in-memory storage)이 사용되도록 합니다. 사용되는 CREATE TABLE 문은 여전히 TABLESPACE 절을 포함해야 합니다:
1mysql> CREATE TABLE t1 ( 2 -> c1 INT STORAGE DISK, 3 -> c2 INT STORAGE MEMORY 4 -> ) ENGINE NDB; 5ERROR 1005 (HY000): Can't create table 'c.t1' (errno: 140) 6 7mysql> CREATE TABLE t1 ( 8 -> c1 INT STORAGE DISK, 9 -> c2 INT STORAGE MEMORY 10 -> ) TABLESPACE ts_1 ENGINE NDB; 11Query OK, 0 rows affected (1.06 sec)
NDB 테이블의 경우 STORAGE DEFAULT는 STORAGE MEMORY와 동등(equivalent)합니다.
STORAGE 절은 NDB 이외의 스토리지 엔진을 사용하는 테이블에는 효과가 없습니다.
STORAGE 키워드는 NDB Cluster와 함께 제공되는 mysqld 빌드(build)에서만 지원되며, 그 외 MySQL 버전에서는 인식되지 않아 STORAGE 키워드를 사용하려는 시도는 문법 오류(syntax error)를 발생시킵니다.
GENERATED ALWAYSGenerated column 표현식(expression)을 지정하는 데 사용됩니다. generated columns에 대한 정보는 Section 15.1.24.8, “CREATE TABLE and Generated Columns”를 참조하십시오.
Stored generated column은 인덱싱될 수 있습니다. InnoDB는 virtual generated column에 대한 secondary index를 지원합니다. Section 15.1.24.9, “Secondary Indexes and Generated Columns”를 참조하십시오.
Several keywords가 인덱스(indexes), 외래 키(foreign keys), 및 CHECK 제약(constraints) 생성(creation)에 적용됩니다. 다음 설명에 더해 일반적인 배경(background)에 대해서는 Section 15.1.18, “CREATE INDEX Statement”, Section 15.1.24.5, “FOREIGN KEY Constraints”, 및 Section 15.1.24.6, “CHECK Constraints”를 참조하십시오.
CONSTRAINT symbolCONSTRAINT symbol 절(clause)은 제약(constraint)에 이름(name)을 부여하기 위해 사용할 수 있습니다. 절이 주어지지 않거나 CONSTRAINT 키워드 뒤에 _symbol_이 포함되지 않으면, 아래에 언급된 예외(exception)를 제외하고 MySQL은 자동으로 제약 이름을 생성합니다.
사용되는 경우 symbol 값은 스키마(schema, database)당, 제약 타입당 unique여야 합니다. 중복된 _symbol_은 오류를 발생시킵니다. 또한 Section 11.2.1, “Identifier Length Limits”에서 생성된 제약 식별자(constraint identifiers)의 길이 제한(length limits)에 대한 논의(discussion)도 참조하십시오.
참고
Foreign key 정의에서 CONSTRAINT symbol 절이 주어지지 않거나 CONSTRAINT 키워드 뒤에 _symbol_이 포함되지 않으면, MySQL은 자동으로 constraint name을 생성합니다.
SQL 표준은 모든 타입의 제약(primary key, unique index, foreign key, check)이 동일한 네임스페이스(namespace)에 속한다고 지정합니다. MySQL에서는 각 제약 타입이 스키마당 자체 네임스페이스를 가집니다. 따라서 각 타입의 제약 이름은 스키마당 unique여야 하지만, 서로 다른 타입의 제약은 동일한 이름을 가질 수 있습니다.
PRIMARY KEY모든 키 컬럼(key columns)이 NOT NULL로 정의되어야 하는 unique index입니다. 명시적으로 NOT NULL로 선언되지 않은 경우 MySQL은 이를 암묵적으로(그리고 조용히) 그렇게 선언합니다.
테이블은 PRIMARY KEY를 하나만 가질 수 있습니다. PRIMARY KEY의 이름(name)은 항상 PRIMARY이며, 따라서 이는 다른 어떤 종류의 인덱스 이름으로도 사용할 수 없습니다.
PRIMARY KEY가 없고 애플리케이션(application)이 테이블에서 PRIMARY KEY를 요청하면, MySQL은 NULL 컬럼이 없는 첫 번째 UNIQUE 인덱스를 PRIMARY KEY로 반환합니다.
InnoDB 테이블에서는 secondary index에 대한 저장 오버헤드(storage overhead)를 최소화하기 위해 PRIMARY KEY를 짧게 유지하십시오. 각 secondary index 항목(entry)은 해당 행(row)에 대한 primary key 컬럼의 사본(copy)을 포함합니다. (Section 17.6.2.1, “Clustered and Secondary Indexes” 참조.)
생성된 테이블에서 PRIMARY KEY가 먼저 배치되고, 그 다음 모든 UNIQUE 인덱스, 그 다음 nonunique 인덱스가 배치됩니다. 이는 MySQL optimizer가 어떤 인덱스를 사용할지 우선순위를 정하는 데 도움이 되며, 중복된 UNIQUE 키를 더 빠르게 감지하는 데에도 도움이 됩니다.
PRIMARY KEY는 multiple-column 인덱스가 될 수 있습니다. 그러나 컬럼 지정(column specification)에서 PRIMARY KEY 키 속성(key attribute)을 사용하여 multiple-column 인덱스를 생성할 수는 없습니다. 그렇게 하면 해당 단일 컬럼(single column)만 primary로 표시됩니다. 별도의 PRIMARY KEY(key_part, ...) 절(clause)을 사용해야 합니다.
테이블이 정수 타입(integer type)의 단일 컬럼(single column)으로 구성된 PRIMARY KEY 또는 UNIQUE NOT NULL 인덱스를 가지는 경우, Unique Indexes에 설명된 대로 SELECT 문에서 인덱싱된 컬럼을 참조하기 위해 _rowid를 사용할 수 있습니다.
MySQL에서 PRIMARY KEY의 이름은 PRIMARY입니다. 다른 인덱스의 경우 이름을 지정하지 않으면 인덱스는 첫 번째 인덱싱된 컬럼과 동일한 이름으로 할당(assigned)되며, unique하게 만들기 위해 선택적 접미사(optional suffix)(_2, _3, ...)가 붙을 수 있습니다.
SHOW INDEX FROM tbl_name을 사용하여 테이블의 인덱스 이름을 볼 수 있습니다. Section 15.7.7.24, “SHOW INDEX Statement”를 참조하십시오.
15.1.23 CREATE SPATIAL REFERENCE SYSTEM Statement
15.1.25 CREATE TABLESPACE Statement