RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
YandexMoney: 
41001198119846 
E-gold:
5128052

7 Определение данных: CREATE, DROP, ALTER

7.1 Синтаксис CREATE DATABASE

CREATE DATABASE [IF NOT EXISTS] db_name

CREATE DATABASE создает базу данных с указанным именем. Правила для допустимых имен баз данных приведены в разделе "3.2 Имена баз данных, таблиц, индексов, столбцов и псевдонимов". Ошибка происходит, если база данных уже существует, и Вы не определяли IF NOT EXISTS.

Базы данных в MySQL выполнены как каталоги, содержащие файлы, которые соответствуют таблицам в базе данных. Поскольку нет никаких таблиц в базе данных, когда она первоначально создана, инструкция CREATE DATABASE только создает каталог под каталогом данных MySQL.

Вы можете также создавать базы данных с помощью программы mysqladmin. Подробности в разделе "12 Клиентские скрипты и утилиты MySQL".

7.2 Синтаксис 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".

7.3 Синтаксис 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.
  • В MySQL ключ 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 ".
  • В MySQL Version 3.23.23 или позже Вы можете также создавать специальные индексы FULLTEXT. Они используются для полнотекстового поиска. Только тип таблицы 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.
    Если тип таблицы определен, и этот специфический тип недоступен, MySQL выберет тип таблицы самый близкий к тому, который Вы определили. Например, если определен TYPE=BDB, но этот дистрибутив MySQL не поддерживает таблицы типа BDB, таблица будет создана как MyISAM. Другие параметры таблицы используются, чтобы оптимизировать поведение таблицы. В большинстве случаев, Вы не должны их определять. Параметры всегда работают для всех типов таблицы, если не оговорено обратное явно.
    AUTO_INCREMENTУстановить следующее значение auto_increment для Вашей таблицы (только MyISAM).
    AVG_ROW_LENGTHПриближенное значение средней длины строки для Вашей таблицы. Вы должны установить это только для больших таблиц с записями переменного размера.
    CHECKSUMУстановите это в 1, если Вы хотите, чтобы MySQL поддержал контрольную сумму для всех строк (делает таблицу немного медленнее, чтобы модифицировать, но делает проще поиск повреждений таблицы, только для MyISAM).
    COMMENT60-символьный комментарий к таблице.
    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.

7.3.1 Тихие изменения спецификации столбца

В некоторых случаях 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 отображает некоторые типы столбца, используемые другими SQL-серверами баз данных к типам MySQL. Подробности в разделе "5.5 Использование типов столбцов из других баз данных".

Если Вы хотите видеть, использовал или нет MySQL столбец не того типа, какой Вы определили, выдайте инструкцию DESCRIBE tbl_name после создания или изменения Вашей таблицы.

Некоторые другие изменения типа столбца могут происходить, если Вы сжимаете таблицу, используя myisampack.

7.4 Синтаксис 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 ".
  • Начиная с MySQL 4.0 вышеупомянутое свойство может быть активизировано явно. 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 пробует преобразовывать данные к новому типу.
  • В MySQL Version 3.22 или позже Вы можете использовать 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".

7.5 Синтаксис 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 сталкивается с любыми ошибками в процессе переименования, он будет делать обратное переименование для всех переименованных таблиц, чтобы вернуть все обратно в первоначальное состояние.

7.6 Синтаксис DROP TABLE

DROP TABLE [IF EXISTS] tbl_name [, tbl_name,...] [RESTRICT | CASCADE]

DROP TABLE удаляет одну или большее количество таблиц. Все данные таблицы и определение таблицы будут удалены, так что будьте внимательны с этой командой!

В MySQL Version 3.22 или позже Вы можете использовать ключевые слова IF EXISTS, чтобы предотвратить ошибку для таблиц, которых нет.

RESTRICT и CASCADE ничего не делают и нужны лишь для совместимости с другими СУБД.

ОБРАТИТЕ ВНИМАНИЕ: DROP TABLE не транзакционно-безопасна и автоматически завершает любые активные транзакции.

7.7 Синтаксис 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".

7.8 Синтаксис 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".

Поиск

 

Найди своих коллег!