| |
CREATE
,
DROP
, ALTER
CREATE DATABASE
CREATE DATABASE [IF NOT EXISTS] db_name
CREATE DATABASE
создает базу данных с указанным именем.
Правила для допустимых имен баз данных приведены в разделе
"3.2 Имена баз данных, таблиц, индексов,
столбцов и псевдонимов". Ошибка происходит, если база данных уже
существует, и Вы не определяли IF NOT EXISTS
.
Базы данных в MySQL выполнены как каталоги, содержащие файлы, которые
соответствуют таблицам в базе данных. Поскольку нет никаких таблиц в базе
данных, когда она первоначально создана, инструкция CREATE
DATABASE
только создает каталог под каталогом данных MySQL.
Вы можете также создавать базы данных с помощью
программы mysqladmin
. Подробности в разделе
"12 Клиентские скрипты и утилиты
MySQL".
DROP DATABASE
DROP DATABASE [IF EXISTS] db_name
DROP DATABASE
удаляет все таблицы в базе данных и удаляет
саму базу данных. Если выполнили DROP DATABASE
на символически
связанной базе данных, связь и первоначальная база данных будут удалены.
Будьте ОЧЕНЬ осторожны с этой командой!
DROP DATABASE
возвращает число файлов, которые были удалены
из каталога баз данных. Обычно это кратное трем число потому, что каждая
таблица соответствует файлам .MYD, .MYI и .frm.
Команда DROP DATABASE
удаляет из заданного каталога базы
данных все найденные файлы со следующими расширениями:
.BAK | .DAT | .HSH | .ISD |
.ISM | .ISM | .MRG | .MYD |
.MYI | .db | .frm |
Все подкаталоги, имена которых состоят из 2 цифр (каталоги
RAID
), также будут удалены.
В MySQL Version 3.22 или позже Вы можете использовать ключевые слова
IF EXISTS
, чтобы предотвратить ошибку, если база
данных не существует.
Вы можете также удалять базы данных с помощью
команды mysqladmin
. Подробности в разделе
"12 Клиентские скрипты и утилиты
MySQL".
CREATE TABLE
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [select_statement] create_definition: col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [PRIMARY KEY] [reference_definition] or PRIMARY KEY (index_col_name,...) or KEY [index_name] (index_col_name,...) or INDEX [index_name] (index_col_name,...) or UNIQUE [INDEX] [index_name] (index_col_name,...) or FULLTEXT [INDEX] [index_name] (index_col_name,...) or [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name,...) [reference_definition] or CHECK (expr) type: TINYINT[(length)] [UNSIGNED] [ZEROFILL] or SMALLINT[(length)] [UNSIGNED] [ZEROFILL] or MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL] or INT[(length)] [UNSIGNED] [ZEROFILL] or INTEGER[(length)] [UNSIGNED] [ZEROFILL] or BIGINT[(length)] [UNSIGNED] [ZEROFILL] or REAL[(length,decimals)] [UNSIGNED] [ZEROFILL] or DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL] or FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL] or DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL] or NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL] or CHAR(length) [BINARY] or VARCHAR(length) [BINARY] or DATE or TIME or TIMESTAMP or DATETIME or TINYBLOB or BLOB or MEDIUMBLOB or LONGBLOB or TINYTEXT or TEXT or MEDIUMTEXT or LONGTEXT or ENUM(value1,value2,value3,...) or 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 | MYISAM } or AUTO_INCREMENT = # or AVG_ROW_LENGTH = # or CHECKSUM = {0 | 1} or COMMENT = "string" or MAX_ROWS = # or MIN_ROWS = # or PACK_KEYS = {0 | 1} or PASSWORD = "string" or DELAY_KEY_WRITE = {0 | 1} or ROW_FORMAT= { default | dynamic | fixed | compressed } or RAID_TYPE= {1 | STRIPED | RAID0 } RAID_CHUNKS=# RAID_CHUNKSIZE=# or UNION = (table_name,[table_name...]) or DATA DIRECTORY="directory" or INDEX DIRECTORY="directory" select_statement: [IGNORE | REPLACE] SELECT ... (Some legal select statement)
CREATE TABLE
создает таблицу с заданным именем в текущей базе
данных. Правила для допустимых имен таблицы даны в разделе
"3.2 Имена баз данных, таблиц, индексов,
столбцов и псевдонимов". Ошибка происходит, если не имеется никакой
текущей базы данных, или если таблица уже существует.
В MySQL Version 3.22 или позже имя таблицы может быть определено как
db_name.tbl_name
. Это работает независимо от того, имеется или
нет текущая база данных.
В MySQL Version 3.23 или позже Вы можете использовать ключевое слово
TEMPORARY
, когда Вы создаете таблицу. Временная таблица будет
автоматически удалена, если подключение завершается. Причем, имя связано с
подключением. Это означает, что два различных подключения могут оба
использовать то же самое имя временной таблицы без того, чтобы войти в
противоречие друг с другом или с существующей таблицей с тем же самым именем.
Существующая таблица будет скрыта, пока временная таблица не удалена.
В MySQL Version 3.23 или позже Вы можете использовать ключевые слова
IF NOT EXISTS
, чтобы ошибка не произошла, если таблица уже
существует. Обратите внимание, что не имеется никакой проверки, что структуры
таблиц идентичны.
Каждая таблица tbl_name
представляется некоторыми файлами в
каталоге баз данных. В случае таблиц MyISAM-типа Вы получите:
Файл | Назначение |
tbl_name.frm | Определение таблицы (форма) |
tbl_name.MYD | Данные таблицы |
tbl_name.MYI | Индекс таблицы |
Для получения большего количества информации относительно свойств различных типов столбцов обратитесь к разделу "5 Типы столбцов":
NULL
или NOT NULL
не определены,
столбец обрабатывается, как если бы был определен NULL
.
AUTO_INCREMENT
. Когда Вы вставляете значение NULL
(рекомендуется) или 0
в столбец с атрибутом
AUTO_INCREMENT
, столбец будет установлен в значение
value+1
, где value
представляет собой самое большое
значение для столбца в настоящее время в данной таблице.
AUTO_INCREMENT
-последовательности начинаются с 1
.
Если Вы удаляете строку, содержащую максимальное значение для столбца
AUTO_INCREMENT
, значение будет многократно использоваться для
таблиц ISAM
или BDB
, но не для таблиц типов
MyISAM
или InnoDB
. Если Вы удаляете все строки в
таблице с помощью вызова DELETE FROM table_name
(без
WHERE
) в режиме AUTOCOMMIT
, последовательность
начинается сначала для всех типов таблицы. ОБРАТИТЕ ВНИМАНИЕ:
может иметься только один столбец AUTO_INCREMENT
на
таблицу, и он должен быть индексирован. MySQL Version 3.23 будет также
работать правильно, только если столбец auto_increment имеет только
положительные значения. Вставка отрицательного числа будет расценена как
вставка очень большого положительного номера. Это выполнено, чтобы избежать
проблем точности, когда числа переходят от положительного к отрицательному и
также гарантировать, что случайно не получается столбец
auto_increment, который содержит 0.
Чтобы сделать MySQL совместимым с
некоторыми прикладными программами ODBC, Вы можете находить последнюю
вставленную строку следующим запросом:
SELECT * FROM tbl_name WHERE auto_col IS NULL
NULL
для столбцов TIMESTAMP
будут
обработаны иначе, чем для других типов столбцов. Вы не можете сохранять
литеральный NULL
в столбце TIMESTAMP
. Установка
столбца в NULL
приведет его к текущей (актуальной) дате и
времени. Поскольку столбцы TIMESTAMP
ведут себя именно так,
атрибуты NULL
и NOT NULL
не применяются нормальным
способом и игнорируются, если Вы определяете их. С другой стороны, чтобы
сделать это проще для MySQL-клиентуры, сервер сообщает, что таким столбцам
могут быть назначены значения NULL
(это и правда так), даже при
том, что TIMESTAMP
никогда фактически не будет содержать
значение NULL
. Вы можете видеть это, когда Вы используете
DESCRIBE tbl_name
, чтобы получить описание Вашей таблицы.
Обратите внимание, что установка столбца TIMESTAMP
в
0
не устанавливает его в NULL
, поскольку
0
имеющее силу значение TIMESTAMP
.
DEFAULT
не определено для столбца,
MySQL автоматически назначает его. Если столбец может брать как значение
NULL
, значением по умолчанию будет именно NULL
.
Если столбец объявлен как NOT NULL
, значение по умолчанию
зависит от типа столбца:
AUTO_INCREMENT
, значение по умолчанию 0
. Для
столбцов AUTO_INCREMENT
значением по умолчанию будет следующее
значение в последовательности.
TIMESTAMP
, значением по
умолчанию будет соответствующее нулевое значение для типа. Для первого в
таблице столбца TIMESTAMP
значением по умолчанию будет текущая
(актуальная) дата и время. Подробности в разделе
"5.2 Типы Date и Time".
ENUM
, значением по умолчанию является
пустая строка. Для типа ENUM
первое значение перечисления.NOW()
или CURRENT_DATE
.
KEY
представляет собой синоним для INDEX
.
UNIQUE
может иметь только различные значения.
Ошибка происходит, если Вы пробуете добавлять новую строку с ключом, который
соответствует существующей строке.
PRIMARY KEY
является уникальным
KEY
, причем все столбцы ключа должны быть определены как
NOT NULL
. В MySQL такой ключ именован как PRIMARY
.
Таблица может иметь только один PRIMARY KEY
. Если Вы не имеете
PRIMARY KEY
, а некоторые прикладные программы просят о
PRIMARY KEY
в Ваших таблицах, MySQL возвратит первый ключ
UNIQUE
, который не имеет столбцов NULL
.
PRIMARY KEY
может быть многостолбцовым индексом. Однако, Вы
не можете создавать такой индекс, использующий атрибут PRIMARY
KEY
в спецификации столбца. Выполнение этого отметит только один
столбец как первичный. Вы должны использовать вызов
PRIMARY KEY(index_col_name, ...)
.
PRIMARY
или UNIQUE
состоят только из
одного столбца, и он имеет тип integer, Вы можете также обратиться к нему как
_rowid
(нововведение в Version 3.23.11).
index_col_name
, с факультативным суффиксом
(_2
, _3
, ...
): чтобы сделать его
уникальным. Вы можете видеть индексные имена для таблицы, используя
SHOW INDEX FROM tbl_name
. Подробности в разделе
"4.5.5 Синтаксис SHOW
".
MyISAM
поддерживает индексы на столбцах,
которые могут иметь значения NULL
. В других случаях Вы должны
объявить такие столбцы как NOT NULL
.
col_name(length)
Вы можете определять
индекс, который использует только часть столбца типа CHAR
или
VARCHAR
. Это может сделать индексный файл намного меньше.
MyISAM
поддерживает
индексы на столбцах типов BLOB
и TEXT
. При
помещении индекса на столбце BLOB
или TEXT
Вы
ДОЛЖНЫ всегда определять длину индекса:
CREATE TABLE test (blob_col BLOB, index(blob_col(10)));
ORDER BY
или GROUP BY
со
столбцом TEXT
или BLOB
, используется только первые
max_sort_length
байт. Подробности в разделе
"5.3.2 Типы BLOB
и TEXT
".
MyISAM
поддерживает индексы
FULLTEXT
. Они могут быть созданы только из столбцов типов
VARCHAR
и TEXT
. Индексация всегда выполняется над
всем столбцом, частичная индексация пока не поддержана. Подробности в разделе
"9.4 Полнотекстовый поиск в MySQL".
FOREIGN KEY
, CHECK
и
REFERENCES
фактически не делают ничего. Синтаксис для них
обеспечивается только для совместимости, чтобы сделать проще портирование
кода из других SQL-серверов и выполнять прикладные программы, которые создают
таблицы со ссылками. Подробности в разделе
"1.4.4 Функциональные возможности,
отсутствующие в MySQL".
NULL
берет один бит, округляя
занятое им место до самого близкого байта.
row length = 1+(sum of column lengths)+ (number of NULL columns+7)/8+ (number of variable-length columns)
table_options
и SELECT
выполнены только в
MySQL Version 3.23 и выше.
Различные типы таблиц:
BDB или Berkeley_db | Транзакционно-безопасные таблицы с блокировкой страниц. |
HEAP | Данные для этих таблиц сохранены только в памяти. |
ISAM | Первоначальный драйвер таблицы. |
InnoDB | Транзакционно-безопасные таблицы с блокировкой строки. |
MERGE | Совокупность таблиц MyISAM, используемых как одна. |
MyISAM | Новый двоично-независимый драйвер таблицы, который заменяет формат ISAM. |
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). |
PASSWORD | Зашифровать файл .frm
паролем. Эта опция не делает ничего в стандартной версии MySQL. |
DELAY_KEY_WRITE | Установите это в 1, если Вы хотите задержать обновление ключей таблицы до ее закрытия (только MyISAM). |
ROW_FORMAT | Определяет, как строки должны быть сохранены. В настоящее время Вы можете использовать только опции DYNAMIC и STATIC для таблиц типа MyISAM. |
MyISAM
, MySQL использует результат
max_rows*avg_row_length
, чтобы решить насколько большой будет
возникающая в результате таблица. Если Вы не определяете любые из
вышеупомянутых параметров, максимальный размер для таблицы будет 4G (или 2G,
если Ваша операционная система поддерживают только таблицы 2G). Причина для
этого: надо уменьшить размеры указателя, чтобы сделать индекс меньше и
быстрее, если Вы действительно не нуждаетесь в больших файлах.
Если Вы не используете PACK_KEYS
, по умолчанию будут упакованы
только строки, но не числа. Если Вы используете PACK_KEYS=1
,
числа будут упакованы также. При упаковке двоичных цифровых ключей MySQL
использует префиксное сжатие. Это означает, что Вы получите большую пользу от
этого только, если Вы имеете много чисел, которые являются теми же самыми.
Префиксное сжатие означает, что каждый ключ нуждается в одном байте
дополнительного пространства, чтобы указать, сколько байтов предыдущего ключа
совпадают с текущим. Обратите внимание, что указатель на строку сохранен в
порядке со старшим первым байтом непосредственно после ключа, чтобы улучшить
сжатие. Это означает, что, если Вы имеете много равных ключей в строке, все
последующие те же самые ключи будет обычно только брать 2 байта (включая
указатель на строку). Сравните это с обычным случаем, где следующие ключи
будут брать storage_size_for_key+pointer_size (обычно 4) байта. С другой
стороны, если все ключи полностью различны, Вы будете терять 1 байт на ключ,
если он не может иметь значения NULL
(в этом случае, упакованная
длина ключа будет сохранена в том же самом байте, который используется, чтобы
отметить, что этот ключ имеет значение NULL
).
SELECT
после инструкции
CREATE
, 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
и значениями по
умолчанию для новых столбцов.
CREATE TABLE ... SELECT
автоматически не будет создавать никаких
индексов для Вас. Это должно быть выполнено преднамеренно, чтобы сделать
команду настолько гибкой, насколько это вообще возможно. Если Вы хотите иметь
индексы в созданной таблице, Вы должны определить их перед инструкцией
SELECT
:
mysql> create table bar (unique (n)) select n from foo;Если происходят ошибки при копировании данных в таблицу, они будут автоматически удалены. Чтобы гарантировать, что файл регистрации модификаций может использоваться, чтобы освежить первоначальные таблицы, MySQL не будет позволять параллельные вставки в течение выполнения
CREATE
TABLE .... SELECT
.
RAID_TYPE
поможет Вам обойти 2G/4G ограничение для
файла данных MyISAM (но не индексного файла) на операционных системах,
которые не поддерживают большие файлы. Вы можете получать также большее
быстродействие, помещая каталоги RAID
на различных физических
дисках. RAID_TYPE
будет работать с любой OS, если Вы
сконфигурировали 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.
Вы должны иметь привилегии SELECT
, UPDATE
и
DELETE
на таблицах, которые Вы отображаете к таблице
MERGE
. Все отображенные таблицы должны быть в той же самой базе
данных, что и таблица MERGE
.
PRIMARY
будет помещен в начало, за
ним расположатся ключи UNIQUE
, а за ними нормальные ключи. Это
помогает оптимизатору MySQL располагать по приоритетам, который ключ
использовать, а также более быстро обнаруживает дублированные ключи
UNIQUE
.
DATA DIRECTORY="directory"
или INDEX
DIRECTORY="directory"
Вы можете определять, где драйвер таблицы должен
поместить файлы таблицы и индекса. Это работает только для таблиц
MyISAM
в MySQL
4.0, когда Вы не используете опцию
--skip-symlink
.В некоторых случаях MySQL тихо изменяет спецификацию столбца, заданную в
инструкции CREATE TABLE
. Это может также происходить с
ALTER TABLE
:
VARCHAR
-столбцы с длиной меньше, чем четыре, будут
изменены на CHAR
.
VARCHAR
, TEXT
или
BLOB
), все столбцы CHAR
длиной более, чем три
символа, будут изменены на VARCHAR
. В MySQL VARCHAR
всего лишь иной способ хранить символы. MySQL выполняет это преобразование
потому, что оно экономит место и делает операции с таблицей быстрее.
TIMESTAMP
должен быть четный и в диапазоне от 2 до 14. Если
Вы определяете 0 или больше, чем 14, размер принудительно выставится в 14.
Нечетно-оцененные размеры в диапазоне от 1 до 13 принудительно выставятся в
следующее более высокое четное число.
NULL
в столбце
TIMESTAMP
. Установка его в NULL
реально
устанавливает его к текущей (актуальной) дате и времени. Потому, что столбцы
TIMESTAMP
ведут себя именно так, атрибуты NULL
и
NOT NULL
не применяются нормальным способом и игнорируются, если
Вы определяете их. DESCRIBE tbl_name
всегда сообщает, что
столбцу TIMESTAMP
может быть назначено значение
NULL
.
Если Вы хотите видеть, использовал или нет MySQL столбец не того типа,
какой Вы определили, выдайте инструкцию DESCRIBE tbl_name
после
создания или изменения Вашей таблицы.
Некоторые другие изменения типа столбца могут
происходить, если Вы сжимаете таблицу, используя myisampack
.
ALTER TABLE
ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec ...] alter_specification: ADD [COLUMN] create_definition [FIRST | AFTER column_name ] ADD [COLUMN] (create_definition, create_definition,...) ADD INDEX [index_name] (index_col_name,...) ADD PRIMARY KEY (index_col_name,...) ADD UNIQUE [index_name] (index_col_name,...) ADD FULLTEXT [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 create_definition MODIFY [COLUMN] create_definition DROP [COLUMN] col_name DROP PRIMARY KEY DROP INDEX index_name DISABLE KEYS ENABLE KEYS RENAME [TO] new_tbl_name ORDER BY col table_options
ALTER TABLE
позволяет Вам изменять структуру существующей
таблицы. Например, Вы можете добавлять или удалять столбцы, создавать или
уничтожать индексы, изменять тип существующих столбцов, переименовывать
столбцы или непосредственно таблицу. Вы можете также изменять комментарий для
таблицы и тип таблицы. Подробности в разделе
"7.3 Синтаксис CREATE TABLE
".
Если Вы используете ALTER TABLE
, чтобы изменить спецификацию
столбца, но DESCRIBE tbl_name
указывает, что Ваш столбец не был
изменен, возможно, что MySQL игнорировал Вашу модификацию по одной из причин,
описанных в разделе "7.3.1 Тихие
изменения спецификации столбца". Например, если Вы пробуете изменять
столбец VARCHAR
на CHAR
, MySQL будет все же
использовать именно VARCHAR
, если таблица содержит другие
столбцы переменной длины.
ALTER TABLE
работает, делая временную копию первоначальной
таблицы. Перенастройка выполняется на копии, затем первоначальная таблица
будет удалена, а новая переименована в старую. Это выполнено таким способом,
чтобы все модификации были автоматически переназначены к новой таблице. В то
время, как выполняется ALTER TABLE
, первоначальная таблица
читаема другой клиентурой. Модификации и записи остановлены, пока новая
таблица не будет готова.
Обратите внимание, что, если Вы используете любую другую опцию
ALTER TABLE
, чем RENAME
, MySQL будет всегда
создавать временную таблицу, даже если данные не должны быть строго
скопированы (подобно тому, когда Вы изменяете имя столбца). Авторы планируют
исправить это в будущем, но поскольку ALTER TABLE
вызывается
относительно редко, это не имеет высокого приоритета в TODO.
ALTER TABLE
, Вы должны иметь
привилегии ALTER, INSERT и
CREATE на таблице.
IGNORE
представляет собой MySQL-расширение ANSI SQL92. Это
управляет тем, как работает ALTER TABLE
, если имеются дубликаты
на уникальных ключах в новой таблице. Если IGNORE
не определен,
копия прервана и прокручена обратно. Если IGNORE
определен, то
для строк с дубликатами на уникальном ключе используется только первая
строка, другие удалены.
ADD
, ALTER
,
DROP
и CHANGE
в одной инструкции ALTER
TABLE
. Это MySQL-расширение ANSI SQL92, который позволяет только одну
команду на инструкцию ALTER TABLE
.
CHANGE col_name
, DROP col_name
и DROP
INDEX
тоже MySQL-расширения ANSI SQL92.
MODIFY
представляет собой Oracle-расширение ALTER
TABLE
.
COLUMN
реально не работает и может
быть свободно пропущено.
ALTER TABLE tbl_name RENAME TO new_name
без любых других параметров, MySQL просто переименовывает файлы, которые
соответствуют таблице tbl_name
. Нет никакой потребности
создавать временную таблицу. Подробности в разделе
"7.5 Синтаксис RENAME TABLE
".
ALTER TABLE ... DISABLE KEYS
предписывает
прекратить модифицировать неуникальные индексы для таблиц
MyISAM
. ALTER TABLE ... ENABLE KEYS
затем должен
использоваться, чтобы освежить отсутствующие индексы. MySQL делает это
специальным алгоритмом, который намного быстрее, чем вставка ключей один за
другим, блокировка обработки ключей может давать значительное ускорение
работы системы на оптовых вставках.
create_definition
используют тот же самый
синтаксис для ADD
и CHANGE
, что и CREATE
TABLE
. Обратите внимание, что этот синтаксис включает имя столбца, а
не только тип столбца. Подробности в разделе
"7.3 Синтаксис CREATE TABLE
".
CHANGE old_col_name
create_definition
. Чтобы сделать так, определите старые и новые
имена столбца и тип, который столбец в настоящее время имеет. Например, чтобы
переименовать столбец типа INTEGER
из a
в
b
, Вы можете сделать:
mysql> ALTER TABLE t1 CHANGE a b INTEGER;Если Вы хотите изменять тип столбца, но не имя, синтаксис
CHANGE
все еще требует имен двух столбцов, даже если это тот же самый столбец:
mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;Однако, начиная с MySQL Version 3.22.16a, Вы можете также использовать
MODIFY
, чтобы изменить тип столбца без переименования:
mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
CHANGE
или MODIFY
, чтобы
сократить столбец, для которого индекс существует как часть столбца
(например, если Вы имеете индекс на первых 10 символах столбца
VARCHAR
), Вы не можете делать столбец короче, чем число
символов, которые индексированы.
CHANGE
или
MODIFY
, MySQL пробует преобразовывать данные к новому типу.
FIRST
или ADD ... AFTER col_name
, чтобы добавить
столбец в специфической позиции внутри строки таблиц. Значение по умолчанию
должно добавить столбец в последнюю позицию.
ALTER COLUMN
определяет новое значение
по умолчанию для столбца или удаляет старое значение по умолчанию. Если
старое значение по умолчанию удалено, и столбец может быть NULL
,
новое значение по умолчанию будет NULL
. Если столбец не может
быть NULL
, MySQL назначает значение по умолчанию, как описано в
разделе "7.3 Синтаксис CREATE TABLE
".
DROP INDEX
удаляет индекс. Это
расширение MySQL для ANSI SQL92. Подробности в разделе
"7.8 Синтаксис DROP INDEX
".
DROP PRIMARY KEY
удаляет первичный
индекс. Если такой индекс не существует, это удаляет первый
UNIQUE
-индекс в таблице (MySQL отмечает первый ключ
UNIQUE
как PRIMARY KEY
, если никакой PRIMARY
KEY
не был определен явно).
Если Вы добавляете UNIQUE
INDEX
или PRIMARY KEY
к таблице, он будет сохранен перед
любым не-UNIQUE
индексом так, чтобы MySQL мог обнаружить двойные
ключи как можно раньше.
ORDER BY
позволяет Вам создавать новую
таблицу со строками в специфическом порядке. Обратите внимание, что таблица
не будет оставаться в этом порядке после вставок и удалений. В некоторых
случаях это может сделать сортировку проще для MySQL, если таблица сделана
так, как Вы желаете упорядочить ее позже. Эта опция главным образом полезна,
когда Вы знаете, что Вы обычно собираетесь сделать запрос строк в некотором
порядке. Используя эту опцию после больших изменений для таблицы, Вы можете
получить более высокую эффективность.
ALTER TABLE
на
таблице MyISAM
, все неуникальные индексы будут созданы в
отдельном пакете (подобно тому, как это происходит в REPAIR
).
Это ускорит ALTER TABLE
, когда Вы имеете много индексов.Имеется пример, который показывает, некоторые из способов применения
ALTER TABLE
. Мы начинаем с таблицы t1
, которая
создана как показано ниже:
mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));
Чтобы переименовывать таблицу из t1
в t2
, надо:
mysql> ALTER TABLE t1 RENAME t2;
Чтобы изменить столбец a
с типа INTEGER
на тип
TINYINT NOT NULL
(имя оставим прежнее), и столбец b
переделать с типа CHAR(10)
на CHAR(20)
с
одновременным переименованием b
в c
, надо сделать:
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
Чтобы добавить новый столбец типа TIMESTAMP
с именем
d
, надо сделать:
mysql> ALTER TABLE t2 ADD d TIMESTAMP;
Чтобы добавить индекс на столбце d
, и сделать столбец
a
первичным ключом, надо:
mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);
Чтобы удалить столбец c
:
mysql> ALTER TABLE t2 DROP COLUMN c;
Чтобы добавить новый целочисленный столбец c
с поддержкой
AUTO_INCREMENT
, надо:
mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD INDEX (c);
Обратите внимание, что мы индексировали c
потому, что столбец
AUTO_INCREMENT
должен быть индексирован, а также мы объявляем
c
как NOT NULL
потому, что индексированные столбцы
не могут быть NULL
.
Когда Вы добавляете столбец AUTO_INCREMENT
, значения столбца
будут заполнены числами последовательности для Вас автоматически. Вы можете
устанавливать первый номер последовательности, выполняя SET
INSERT_ID=#
перед ALTER TABLE
или используя опцию
AUTO_INCREMENT=#
.
С таблицами MyISAM, если Вы не изменяете столбец на
AUTO_INCREMENT
, номер последовательности не будут изменен. Если
Вы удаляете столбец с поддержкой AUTO_INCREMENT
, а затем
добавляете другой с AUTO_INCREMENT
, числа снова начнутся с 1.
Подробности в разделе "11.6.1
Проблемы с ALTER TABLE
".
RENAME TABLE
RENAME TABLE tbl_name TO new_table_name[, tbl_name2 TO new_table_name2,...]
Переименование выполняется атомно, что означает, что никакой другой поток не может обращаться к любой из таблиц в то время, как выполняется переименование. Это делает возможным заменить таблицу на пустую:
CREATE TABLE new_table (...); RENAME TABLE old_table TO backup_table, new_table TO old_table;
Переименование выполняется слева направо, это означает, что, если Вы хотите менять два имени таблицы, Вы должны сделать так:
RENAME TABLE old_table TO backup_table, new_table TO old_table, backup_table TO new_table;
Таблицы можно не только переименовывать, но еще и перемещать между разными базами данных. Например:
RENAME TABLE current_database.table_name TO other_database.table_name;
Когда Вы выполняете RENAME
, Вы не можете иметь блокированные
таблицы или активные транзакции. Вы должны также иметь привилегии
ALTER
и DROP
на первоначальной таблице и привилегии
CREATE
и INSERT
на новой таблице.
Если MySQL сталкивается с любыми ошибками в процессе переименования, он будет делать обратное переименование для всех переименованных таблиц, чтобы вернуть все обратно в первоначальное состояние.
DROP TABLE
DROP TABLE [IF EXISTS] tbl_name [, tbl_name,...] [RESTRICT | CASCADE]
DROP TABLE
удаляет одну или большее количество таблиц. Все
данные таблицы и определение таблицы будут удалены, так что будьте
внимательны с этой командой!
В MySQL Version 3.22 или позже Вы можете использовать ключевые слова
IF EXISTS
, чтобы предотвратить ошибку для таблиц, которых нет.
RESTRICT
и CASCADE
ничего не делают и нужны лишь
для совместимости с другими СУБД.
ОБРАТИТЕ ВНИМАНИЕ: DROP TABLE
не
транзакционно-безопасна и автоматически завершает любые активные транзакции.
CREATE INDEX
CREATE [UNIQUE|FULLTEXT] INDEX index_name ON tbl_name (col_name[(length)],... )
Инструкция CREATE INDEX
ничего не делает до Version 3.22. В
Version 3.22 или позже CREATE INDEX
она отображена к инструкции
ALTER TABLE
, чтобы создать индексы. Подробности в разделе
"7.4 Синтаксис ALTER TABLE
".
Обычно Вы создаете все индексы на таблице во время непосредственного
создания таблицы с помощью вызова CREATE TABLE
. Подробности в
разделе "7.3 Синтаксис CREATE TABLE
". CREATE INDEX
позволяет Вам добавлять индексы к
существующим в базе таблицам.
Список столбцов в форме (col1,col2,...)
создает индекс по
многим столбцам. Индексные значения будут сформированы, связывая значения из
заданных для индексации столбцов.
Для столбцов CHAR
и VARCHAR
индексы могут быть
созданы с использованием только части столбца, применяя синтаксис
col_name(length)
. На столбцах BLOB
и
TEXT
длина требуется обязательно. Инструкция, показанная ниже,
создает индекс с использованием первых 10 символов из столбца
name
:
mysql> CREATE INDEX part_of_name ON customer (name(10));
Поскольку большинство имен обычно отличается по первым 10 символам, этот
индекс не должен быть намного медленнее, чем индекс, созданный из всего
столбца name
. Также использование частичных столбцов для
индексов может делать индексный файл намного меньше, что сохранит много
дискового пространства и ускорит операции INSERT
!
Обратите внимание, что Вы можете добавлять индекс на столбце, который
может иметь значения NULL
, и на столбцах типов
BLOB
и TEXT
только, если Вы используете
MySQL Version 3.23.2 или более новую и применяете тип таблицы
MyISAM
.
Индексы FULLTEXT
могут индексировать только столбцы типов
VARCHAR
и TEXT
в таблицах типа MyISAM
.
Индексы FULLTEXT
доступны в MySQL Version 3.23.23 и более новых.
Подробности в разделе "9.4
Полнотекстовый поиск в MySQL".
DROP INDEX
DROP INDEX index_name ON tbl_name
DROP INDEX
удаляет индекс с именем index_name
из
таблицы tbl_name
. DROP INDEX
ничего не делает до
версии Version 3.22, а начиная с нее, этот вызов перенацелен на
соответствующий вызов ALTER TABLE
для удаления индекса.
Подробности в разделе "7.4
Синтаксис ALTER TABLE
".
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |