CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [select_statement] или CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name LIKE old_table_name; create_definition: col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [PRIMARY KEY] [reference_definition] или PRIMARY KEY (index_col_name,...) или KEY [index_name] (index_col_name,...) или INDEX [index_name] (index_col_name,...) или UNIQUE [INDEX] [index_name] (index_col_name,...) или FULLTEXT [INDEX] [index_name] (index_col_name,...) или [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...) [reference_definition] или CHECK (expr) type: 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] или CHAR(length) [BINARY] или VARCHAR(length) [BINARY] или DATE или TIME или TIMESTAMP или DATETIME или TINYBLOB или BLOB или MEDIUMBLOB или LONGBLOB или TINYTEXT или TEXT или MEDIUMTEXT или LONGTEXT или ENUM(value1,value2,value3,...) или SET(value1,value2,value3,...) index_col_name: col_name [(length)] reference_definition: REFERENCES tbl_name [(index_col_name,...)] [MATCH FULL | MATCH PARTIAL] [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT table_options: TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MRG_MYISAM | MYISAM } или AUTO_INCREMENT = # или AVG_ROW_LENGTH = # или CHECKSUM = {0 | 1} или COMMENT = "string" или MAX_ROWS = # или MIN_ROWS = # или PACK_KEYS = {0 | 1 | DEFAULT} или PASSWORD = "string" или DELAY_KEY_WRITE = {0 | 1} или ROW_FORMAT= { default | dynamic | fixed | compressed } или RAID_TYPE= {1 | STRIPED | RAID0 } RAID_CHUNKS=# RAID_CHUNKSIZE=# или UNION = (table_name,[table_name...]) или INSERT_METHOD= {NO | FIRST | LAST } или DATA DIRECTORY="абсолютный путь к каталогу" или INDEX DIRECTORY="абсолютный путь к каталогу" select_statement: [IGNORE | REPLACE] SELECT ... (любое корректное выражение SELECT)
Оператор CREATE TABLE
создает таблицу с заданным именем в текущей базе
данных. Правила для допустимых имен таблицы приведены в разделе Раздел 6.1.2, «Имена баз данных, таблиц, столбцов, индексы псевдонимы». Если нет активной текущей базы
данных или указанная таблица уже существует, то возникает ошибка
выполнения команды.
В версии MySQL 3.22 и более поздних имя таблицы может быть указано как
db_name.tbl_name
. Эта форма записи работает независимо от того, является
ли указанная база данных текущей.
Начиная с MySQL 3.23 при создании таблицы можно использовать ключевое слово
TEMPORARY
. Временная таблица автоматически удаляется по завершении
соединения, а ее имя действительно только в течение данного соединения.
Это означает, что в двух разных соединениях могут использоваться временные
таблицы с одинаковыми именами без конфликта друг с другом или с
существующей таблицей с тем же именем (существующая таблица скрыта, пока
не удалена временная таблица). С версии MySQL 4.0.2 для создания временных
таблиц необходимо иметь привилегии CREATE TEMPORARY TABLES
.
В версии MySQL 3.23 и более поздних можно использовать ключевые слова IF NOT EXISTS
для того, чтобы не возникала ошибка, если указанная таблица
уже существует. Следует учитывать, что при этом не проверяется
идентичность структур этих таблиц.
В MySQL 4.1 вы можете указать LIKE
чтобы создавать таблицу, основываясь на
определении другой, уже существующей, таблицы. В MySQL 4.1 также можете
определять тип автоматически создаваемого столбца:
CREATE TABLE foo (a tinyint not null) SELECT b+1 AS 'a' FROM bar;
Каждая таблица tbl_name
представлена определенными файлами в директории
базы данных. В случае таблиц типа MyISAM
это следующие файлы:
Файл | Назначение |
tbl_name.frm |
Файл определения таблицы |
tbl_name.MYD |
Файл данных |
tbl_name.MYI |
Файл индексов |
Чтобы получить более полную информацию о свойствах различных типов столбцов, Раздел 6.2, «Типы данных столбцов»:
Если не указывается ни
NULL
, ниNOT NULL
, то столбец интерпретируется так, как будто указаноNULL
.-
Целочисленный столбец может иметь дополнительный атрибут
AUTO_INCREMENT
. При записи величиныNULL
(рекомендуется) или0
в столбецAUTO_INCREMENT
данный столбец устанавливается в значениеvalue+1
, гдеvalue
представляет собой наибольшее для этого столбца значение в таблице на момент записи. ПоследовательностьAUTO_INCREMENT
начинается с1
. See Раздел 8.4.3.31, «mysql_insert_id()
». Если удалить строку, содержащую максимальную величину для столбцаAUTO_INCREMENT
, то в таблицах типаISAM
илиBDB
эта величина будет восстановлена, а в таблицах типаMyISAM
илиInnoDB
- нет. Если удалить все строки в таблице командойDELETE FROM table_name
(без выраженияWHERE
) в режимеAUTOCOMMIT
, то для таблиц всех типов последовательность начнется заново.Примечание: в таблице может быть только один столбец
AUTO_INCREMENT
, и он должен быть индексирован. Кроме того, версия MySQL 3.23 будет правильно работать только с положительными величинами столбцаAUTO_INCREMENT
. В случае внесения отрицательного числа оно интерпретируется как очень большое положительное число. Это делается, чтобы избежать проблем с точностью, когда числа ``заворачиваются'' от положительного к отрицательному и, кроме того, для гарантии, что по ошибке не будет получен столбецAUTO_INCREMENT
со значением0
. В таблицахMyISAM
иBDB
можно указать вторичный столбецAUTO_INCREMENT
с многостолбцовым ключом. See Раздел 3.5.9, «Использование атрибута AUTO_INCREMENT».Последнюю внесенную строку можно найти с помощью следующего запроса (чтобы сделать MySQL совместимым с некоторыми ODBC-приложениями):
SELECT * FROM tbl_name WHERE auto_col IS NULL
CREATE TABLE
автоматически принимает текущую открытую транзакцию в InnoDB если в MySQL включен двоичный журнал.-
Величины
NULL
для столбца типаTIMESTAMP
обрабатываются иначе, чем для столбцов других типов. В столбцеTIMESTAMP
нельзя хранить литералNULL
; при установке данного столбца вNULL
он будет установлен в текущее значение даты и времени. Поскольку столбцыTIMESTAMP
ведут себя подобным образом, то атрибутыNULL
иNOT NULL
неприменимы в обычном режиме и игнорируются при их задании.С другой стороны, чтобы облегчить клиентам MySQL использование столбцов
TIMESTAMP
, сервер сообщает, что таким столбцам могут быть назначены величиныNULL
(что соответствует действительности), хотя реальноTIMESTAMP
никогда не будет содержать величиныNULL
. Это можно увидеть, применивDESCRIBE tbl_name
для получения описания данной таблицы. Следует учитывать, что установка столбцаTIMESTAMP
в0
не равнозначна установке его вNULL
, поскольку0
дляTIMESTAMP
является допустимой величиной. -
Величина
DEFAULT
должна быть константой, она не может быть функцией или выражением. Если для данного столбца не задается никакой величиныDEFAULT
, то MySQL автоматически назначает ее. Если столбец может приниматьNULL
как допустимую величину, то по умолчанию присваивается значениеNULL
. Если столбец объявлен какNOT NULL
, то значение по умолчанию зависит от типа столбца:Для числовых типов, за исключением объявленных с атрибутом
AUTO_INCREMENT
, значение по умолчанию равно0
. Для столбцаAUTO_INCREMENT
значением по умолчанию является следующее значение в последовательности для этого столбца.-
Для типов даты и времени, отличных от
TIMESTAMP
, значение по умолчанию равно соответствующей нулевой величине для данного типа. Для первого столбцаTIMESTAMP
в таблице значение по умолчанию представляет собой текущее значение даты и времени. See Раздел 6.2.2, «Типы данных даты и времени».Для типов даты и времени, отличных от
TIMESTAMP
, значение по умолчанию равно соответствующей нулевой величине для данного типа. Для первого столбцаTIMESTAMP
в таблице значение по умолчанию представляет собой текущее значение даты и времени. See Раздел 6.2.2, «Типы данных даты и времени». Для строковых типов, кроме
ENUM
, значением по умолчанию является пустая строка. ДляENUM
значение по умолчанию равно первой перечисляемой величине.
Значения по умолчанию должны быть константами. Это означает, например, что нельзя установить для столбца даты в качестве значения по умолчанию величину функции, такой как
NOW()
илиCURRENT_DATE
. KEY
является синонимом дляINDEX
.В MySQL ключ
UNIQUE
может иметь только различающиеся значения. При попытке добавить новую строку с ключом, совпадающим с существующей строкой, возникает ошибка выполнения команды.-
PRIMARY KEY
представляет собой уникальный ключKEY
с дополнительным ограничением, что все столбцы с данным ключом должны быть определены какNOT NULL
. В MySQL этот ключ называетсяPRIMARY
(первичный). Таблица может иметь только один первичный ключPRIMARY KEY
. ЕслиPRIMARY KEY
отсутствует в таблицах, а некоторое приложение запрашивает его, то MySQL может превратить вPRIMARY KEY
первый ключUNIQUE
, не имеющий ни одного столбцаNULL
. PRIMARY KEY
может быть многостолбцовым индексом. Однако нельзя создать многостолбцовый индекс, используя в определении столбца атрибут ключаPRIMARY KEY
. Именно таким образом только один столбец будет отмечен как первичный. Необходимо использовать синтаксисPRIMARY KEY(index_col_name, ...
).Если ключ
PRIMARY
илиUNIQUE
состоит только из одного столбца и он принадлежит к числовому типу, то на него можно сослаться также как на_rowid
(новшество версии 3.23.11).Если индексу не назначено имя, то ему будет присвоено первое имя в
index_col_name
, возможно, с суффиксами (_2
,_3
,...
), делающими это имя уникальным. Имена индексов для таблицы можно увидеть, используяSHOW INDEX FROM tbl_name
.SHOW Syntax
.-
Только таблицы типов
MyISAM
,InnoDB
иBDB
поддерживают индексы столбцов, которые могут иметь величиныNULL
. В других случаях, во избежание ошибки, необходимо объявлять такие столбцы какNOT NULL
. С помощью выражения
col_name(length)
можно указать индекс, для которого используется только часть столбцаCHAR
илиVARCHAR
. Это поможет сделать файл индексов намного меньше. See Раздел 5.4.4, «Индексы столбцов».-
Индексацию столбцов
BLOB
иTEXT
поддерживают только таблицы с типомMyISAM
. Назначая индекс столбцу с типомBLOB
илиTEXT
, всегда НЕОБХОДИМО указывать длину этого индекса:CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
При использовании выражений
ORDER BY
илиGROUP BY
со столбцом типаTEXT
илиBLOB
используются только первыеmax_sort_length
байтов. See Раздел 6.2.3.2, «Типы данныхBLOB
иTEXT
».В версии MySQL 3.23.23 и более поздних можно создавать также специальные индексы
FULLTEXT
. Они применяются для полнотекстового поиска. Эти индексы поддерживаются только таблицами типаMyISAM
и они могут быть созданы только из столбцовCHAR
,VARCHAR
иTEXT
. Индексирование всегда выполняется для всего столбца целиком, частичная индексация не поддерживается. Более подробно эта операция описана в разделе MySQL Раздел 6.8, «Полнотекстовый поиск в MySQL».Выражения
FOREIGN KEY
,CHECK
иREFERENCES
фактически ничего не делают. Они введены только из соображений совместимости, чтобы облегчить перенос кода с других SQL-серверов и запускать приложения, создающие таблицы со ссылками. See Раздел 1.9.3, «Расширения MySQL к ANSI SQL92».-
В MySQL версии 3.23.44 или более поздней, таблицы InnoDB выполняют проверку ограничений внешнего ключа. See Раздел 7.5, «Таблицы
InnoDB
». Однако обратите внимание, что синтаксисFOREIGN KEY
в InnoDB более строгий чем приведенный выше. InnoDB не допускает указанияindex_name
. Также столбцы таблицы, на которую ссылаются, должны быть явно указаны. Начиная с 4.0.8 InnoDB поддерживает действияON DELETE
иON UPDATE
.Для уточнения синтаксиса см. документацию по InnoDB. See Раздел 7.5, «Таблицы
InnoDB
». Для остальных типов таблиц, MySQL делает синтаксической разбор указанийFOREIGN KEY
,CHECK
иREFERENCES
вCREATE TABLE
, но при этом успешно их игнорирует. See Раздел 1.9.4.5, «Внешние ключи». Для каждого столбца
NULL
требуется один дополнительный бит, при этом величина столбца округляется в большую сторону до ближайшего байта.-
Максимальную длину записи в байтах можно вычислить следующим образом:
длина записи = 1 + (сумма длин столбцов) + (количество столбцов с допустимым NULL + 7)/8 + (количество столбцов с динамической длинной)
-
Опции
table_options
иSELECT
реализованы только в версиях MySQL 3.23 и выше. Ниже представлены различные типы таблиц:Тип таблицы Описание BDB или BerkeleyDB Таблицы с поддержкой транзакций и блокировкой страниц. See Раздел 7.6, «Таблицы BDB
или BerkeleyDB».HEAP Данные для этой таблицы хранятся только в памяти. See Раздел 7.4, «Таблицы HEAP
».ISAM Оригинальный обработчик таблиц. See Раздел 7.3, «Таблицы ISAM
».InnoDB Таблицы с поддержкой транзакций и блокировкой строк. See Раздел 7.5, «Таблицы InnoDB
».MERGE Набор таблиц MyISAM, используемый как одна таблица. See Раздел 7.2, «Таблицы MERGE
».MRG_MyISAM Псевдоним для таблиц MERGE MyISAM Новый обработчик, обеспечивающий переносимость таблиц в бинарном виде, который заменяет ISAM. See Раздел 7.1, «Таблицы MyISAM
».See Глава 7, Типы таблиц MySQL.
Если задается тип таблицы, который не поддерживается данной версией, то MySQL выберет из возможных типов ближайший к указанному. Например, если задается
TYPE=BDB
и данный дистрибутив MySQL не поддерживает таблицBDB
, то вместо этого будет создана таблицаMyISAM
. Другие табличные опции используются для оптимизации характеристик таблицы. Эти опции в большинстве случаев не требуют специальной установки. Данные опции работают с таблицами всех типов, если не указано иное:Опция Описание AUTO_INCREMENT Следующая величина AUTO_INCREMENT
, которую следует установить для данной таблицы (MyISAM
).AVG_ROW_LENGTH Приближенное значение средней длины строки для данной таблицы. Имеет смысл устанавливать только для обширных таблиц с записями переменной длины. CHECKSUM Следует установить в 1
, чтобы в MySQL поддерживалась проверка контрольной суммы для всех строк (это делает таблицы немного более медленными при обновлении, но позволяет легче находить поврежденные таблицы) (MyISAM
).COMMENT Комментарий для данной таблицы длиной 60 символов. MAX_ROWS Максимальное число строк, которые планируется хранить в данной таблице. MIN_ROWS Минимальное число строк, которые планируется хранить в данной таблице. PACK_KEYS Следует установить в 1
для получения меньшего индекса. Обычно это замедляет обновление и ускоряет чтение (MyISAM
,ISAM
). Установка в0
отключит уплотнение ключей. При установке вDEFAULT
(MySQL 4.0) обработчик таблиц будет уплотнять только длинные столбцыCHAR/VARCHAR
.PASSWORD Шифрует файл .frm
с помощью пароля. Эта опция не функционирует в стандартной версии MySQL.DELAY_KEY_WRITE Установка в 1
задерживает операции обновления таблицы ключей, пока не закроется указанная таблица (MyISAM
).ROW_FORMAT Определяет, каким образом должны храниться строки. В настоящее время эта опция работает только с таблицами MyISAM
, которые поддерживают форматы строкDYNAMIC
иFIXED
. See Раздел 7.1.2, «Форматы таблицMyISAM
».При использовании таблиц
MyISAM
MySQL вычисляет выражениеmax_rows * avg_row_length
, чтобы определить, насколько велика будет результирующая таблица. Если не задана ни одна из вышеупомянутых опций, то максимальный размер таблицы будет составлять 4Гб (или 2Гб если данная операционная система поддерживает только таблицы величиной до 2Гб). Это делается для того, чтобы, если нет реальной необходимости в больших файлах, ограничить размеры указателей, что позволит сделать индексы меньше и быстрее. Если опцияPACK_KEYS
не используется, то по умолчанию уплотняются только строки, но не числа. При использованииPACK_KEYS=1
числа тоже будут уплотняться. При уплотнении двоичных числовых ключей MySQL будет использовать сжатие префиксов. Это означает, что выгода от этого будет значительной только в случае большого количества одинаковых чисел. При сжатии префиксов для каждого ключа требуется один дополнительный байт, в котором указано, сколько байтов предыдущего ключа являются такими же, как и для следующего (следует учитывать, что указатель на строку хранится в порядке "старший-байт-в-начале" сразу после ключа - чтобы улучшить компрессию).Это означает, что при наличии нескольких одинаковых ключей в двух строках записи все последующие ``аналогичные'' ключи будут занимать только по 2 байта (включая указатель строки). Сравним: в обычном случае для хранения последующих ключей требуется
размер_хранения_ключа + размер_указателя (обычно 4)
байтов. С другой стороны, если все ключи абсолютно разные, каждый ключ будет занимать на 1 байт больше, если данный ключ не может иметь величинуNULL
(в этом случае уплотненный ключ будет храниться в том же байте, который используется для указания, что ключ равенNULL
). -
Если после команды
CREATE
указывается командаSELECT
, то MySQL создаст новые поля для всех элементов в данной командеSELECT
. Например:mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (a), KEY(b)) TYPE=MyISAM SELECT b,c FROM test2;
Эта команда создаст таблицу
MyISAM
с тремя столбцамиa
,b
иc
. Отметим, что столбцы из команды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
вносится в таблицуbar
со своим значением изfoo
, при этом в новые столбцы в таблицеbar
записываются величины, заданные по умолчанию. КомандаCREATE TABLE ... SELECT
не создает автоматически каких-либо индексов. Это сделано преднамеренно, чтобы команда была настолько гибкой, насколько возможно. Чтобы иметь индексы в созданной таблице, необходимо указать их перед данной командойSELECT
:mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;
Если возникает ошибка при копировании данных в таблицу, то они будут автоматически удалены. Чтобы обеспечить возможность использовать для восстановления таблиц журнал обновлений/двоичный журнал, в MySQL во время выполнения команды
CREATE TABLE ... SELECT
не разрешены параллельные вставки. Воспользовавшись опцией
RAID_TYPE
, можно разбить файл данныхMyISAM
на участки с тем, чтобы преодолеть 2Гб/4Гб лимит файловой системы под управлением ОС, не поддерживающих большие файлы. Разбиение не касается файла индексов. Следует учесть, что для файловых систем, которые поддерживают большие файлы, эта опция не рекомендуется! Для получения более высокой скорости ввода-вывода можно разместить RAID-директории на различных физических дисках.RAID_TYPE
будет работать под любой операционной системой, если конфигурация MySQL выполнена с параметром--with-raid
. В настоящее время для опцииRAID_TYPE
возможен только параметрSTRIPED
(1
иRAID0
являются псевдонимами для него). Если указываетсяRAID_TYPE=STRIPED
для таблицыMyISAM
, тоMyISAM
создаст поддиректорииRAID_CHUNKS
с именами00
,01
,02
в директории базы данных. В каждой из этих директорийMyISAM
создаст файлtable_name.MYD
. При записи данных в файл данных обработчик RAID установит соответствие первыхRAID_CHUNKSIZE*1024
байтов первому упомянутому файлу, следующихRAID_CHUNKSIZE*1024
байтов - следующему файлу и так далее.Опция
UNION
применяется, если необходимо использовать совокупность идентичных таблиц как одну таблицу. Она работает только с таблицамиMERGE
. See Раздел 7.2, «ТаблицыMERGE
». На данный момент для таблиц, сопоставляемых с таблицейMERGE
, необходимо иметь привилегииSELECT
,UPDATE
иDELETE
. Все сопоставляемые таблицы должны принадлежать той же базе данных, что и таблицаMERGE
.Для внесения данных в таблицу
MERGE
необходимо указать с помощьюINSERT_METHOD
, в какую таблицу данная строка должна быть внесена. See Раздел 7.2, «ТаблицыMERGE
». Эта опция была введена в MySQL 4.0.0.В созданной таблице ключ
PRIMARY
будет помещен первым, за ним все ключиUNIQUE
и затем простые ключи. Это помогает оптимизатору MySQL определять приоритеты используемых ключей, а также более быстро определять сдублированные ключиUNIQUE
.Используя опции
DATA DIRECTORY="каталог"
илиINDEX DIRECTORY="каталог"
, можно указать, где обработчик таблицы должен помещать свои табличные и индексные файлы. Следует учитывать, что указываемый параметр directory должен представлять собой полный путь к требуемому каталогу (а не относительный путь). Данные опции работают только для таблицMyISAM
в версии MySQL 4.0, если при этом не используется опция--skip-symlink
. See Раздел 5.6.1.2, «Использование символических ссылок для таблиц».