Реализация языка SQL в СУБД MySQL
Студент нанимается на лето подработать в
университете, его спрашивают:
- Языком владеешь?
- Я в совершенстве владею языком!
- Отлично, будешь наклеивать марки на конверты.
- Реализация языка SQL в СУБД MySQL
- Коротко о главном
- ALTER TABLE
- CREATE TABLE
- Типы данных
- Ключи
- BLOB'ы
- Двоичные данные в BLOBS
- CREATE INDEX
- DELETE
- DESCRIBE
- DROP
- DROP INDEX
- GRANT
- SELECT
СУБД MySQL предоставляет в Ваше распоряжение подмножество языка SQL,
соответствующее спецификации ANSI SQL 92.
Основные цели MySQL - быстродействие и ошибкоустойчивость. Добавление
транзакций принесет значительное быстродействие и повышение сложности.
В настоящее время имеется проект, который должен дать подобные функциональные
Это, вероятно, будет выполнено, с помощью введения атомарной модификации
нескольких таблиц сразу.
Ядро, на котором сформирован MySQL - набор подпрограмм, которые
использовались в высокотребовательном окружении много лет. В то время, как
MySQL все еще находится в разработке, это уже предоставляет богатый и
полезный функциональный набор.
СИНТАКСИС:
ALTER [IGNORE] TABLE table_name alter_specification [,
alter_specification ...]
alter_specification:
ADD [COLUMN] create_definition or
CHANGE [COLUMN] old_column_name create_definition or
ALTER [COLUMN] column_name { SET default | DROP DEFAULT } or
DROP [COLUMN] column_name or DROP PRIMARY KEY or DROP INDEX key_name
DROP FOREIGN KEY key_name
ОПИСАНИЕ:
Команда ALTER TABLE может быть использована для изменения определения
таблицы. ALTER TABLE работает с временно созданной таблицей в которую
копирует все данные из текущей таблицы. Когда копия готова, старая таблица
удаляется, а новая переименуется в нее. Это выполнено таким способом, что все
изменения автоматически переназначаются на новую таблицу.
Пока работает ALTER TABLE, старая таблица доступна для других клиентов.
Обновления и запись в таблицу останавливаются и будут выполнены только после
того, как новая таблица будет готова. Если IGNORE не определен, то
копирование будет прервано и процесс отработан назад в случае наличия любых
уникальных ключей, дублированных в новой таблице.
- CHANGE column_name, DROP column_name и DROP INDEX являются MySQL
расширениями ANSI SQL.
- [COLUMN] факультативный параметр и может быть опущен.
- Конструкция ALTER [COLUMN] может быть использована для изменения или
удаления старого значения по умолчанию.
- ADD и CHANGE используют один и тот же create_definition, что и CREATE
TABLE. См. CREATE TABLE.
- Если вы удаляете column_name, которое является частью составного ключа,
то часть ключа будет удалена. Если все части ключа удалены, то будет
удален весь ключ.
- DROP PRIMARY KEY удаляет первый уникальный ключ в таблице.
- CHANGE делает лучшее преобразование существующей информации в новый
формат.
- Синтаксис DROP FOREIGN KEY пока существует для запланированных
функциональных возможностей. В настоящее время не делает ничего.
Вы можете использовать функцию C API mysql_info(&MYSQL_RESULT) чтобы
узнать, сколько записей скопировано и сколько удалено из-за дублированных
ключей.
Для использования команды ALTER TABLE вы должны иметь права доступа
select, insert, delete, update, create и
drop для этой таблицы.
СИНТАКСИС:
CREATE TABLE table_name (create_definition, ...)
Здесь create_definition имеет следующий формат:
create_definition:
column_name type NOT NULL [DEFAULT default_value] [ PRIMARY KEY ] or
column_name type [NULL] [ PRIMARY KEY ] or
PRIMARY (KEY|INDEX) [key_name] ( column_name,... ) or
(KEY|INDEX) [key_name] ( column_name[length],...) or
INDEX [key_name] ( column_name[length],...) or
UNIQUE (column_name[length],...) or
FOREIGN (KEY|INDEX) [key_name] (column_name[length],...)
REFERENCES table_name
[ON DELETE (RESTRICT | CASCADE | SET NULL) ]
ОПИСАНИЕ:
В MySQL все поля имеют неявное значение по умолчанию, если объявлены, как
не пустые (NOT NULL). Если вы не даете значения по умолчанию при
использовании не пустого поля, оно будет назначено, исходя из типа поля.
Блок FOREIGN нужен только для совместимости. Ключевое слово REFERENCE тоже
не выполняет в данной версии никаких действий.
Команда MySQL CREATE TABLE не поддерживает ключевое слово SQL CHECK.
Для создания таблицы Вы должны иметь права доступа create.
Замечания:
- Номер столбца может иметь дополнительное ключевое слово AUTO_INCREMENT,
чтобы автоматически получить номер = самый большой номер столбца + 1 для
каждой вставки, в которой номер столбца = 0 или NULL. ТО ЕСТЬ, если Вы
попробуете вставить значение ноля в числовой столбец, который имеет атрибут
AUTO_INCREMENT, Вы получите номер столбца, который на 1 большим, чем самый
большой предварительно использованный номер.
Если Вы желаете начать отсчет не с ноля, просто вставьте желательное
стартовое значение в первой записи, которую Вы вставляете в данную таблицу.
В настоящее время нет никакого другого способа достичь этого эффекта.
ВНИМАНИЕ:
Если Вы используете AUTO_INCREMENT, Вы можете использовать его только в
одном поле таблицы. Обратите внимание также, что это поле должно быть
объявлено как первичный ключ, и должно быть числовым.
- ZEROFILL означает, что значение дополняется слева нулями до максимальной
длины поля.
ПРИМЕР:
INT(5) ZEROFILL; значение 5 превращается в "00005"
- Столбцы ключа и столбцы TIMESTAMP не могут быть пустыми. Для столбцов
ключа атрибут NULL тихо удаляется.
- Вы можете вставить NULL для полей типа TIMESTAMP и числовых полей с
атрибутом AUTO_INCREMENT.
- BLOB столбцы не мог быть ключами. Вы не можете группировать на BLOB.
Однако, можно использовать строковые функции MySQL, чтобы группировать
на подразделах BLOB.
- Теперь можно использовать BLOB столбцы в предложении WHERE.
- Удаленные записи находятся в связанном списке, и последующие вставки
будут повторно использовать старые позиции.
- Каждый столбец, который может принять значение NULL, берет 1 бит
дополнительного пространства.
- Если нет никаких VARCHAR столбцов, и BLOBs, то MySQL использует
фиксированный формат записей. Вы можете ожидать существенно лучшую
эффективность, в этом случае. Также не нужно оптимизировать ваши таблицы
с помощью isamchk, когда используется фиксированный формат записи.
- Если Вы используете записи переменной длины и делаете много модификаций,
Вы должны выполнять время от времени 'isamchk -r table_name'
на таблице, чтобы получить лучшее размещение. Попробуйте команду
'isamchk -ei table_name' для сбора статистики.
- Максимальная длина записи может быть найдена так:
1 + сумма длин столбцов + null_columns/8 + число столбцов переменной
длины.
- В некоторых случаях атрибуты могут тихо меняться после создания:
VARCHAR столбцы с длиной 1 или 2 изменяется на CHAR. При использовании
одних VARCHAR столбцов все CHAR столбцы более длинные, чем 2 изменяется
на VARCHARS.
- При INSERT/UPDATE все строки (CHAR и VARCHAR) приводятся к максимальной
длине, заданной, CREATE. Все хвостовые пробелы автоматически удаляются.
Например, VARCHAR(10) задает, что столбец может содержать строки с
длиной до 10 символов.
- Что угодно/0 дает значение NULL.
- REGEXP использует кодировку ISOLATIN1 при использовании функций
символьного типа, подобно [[:ALPHA:]].
Поля должны иметь один из следующих типов данных:
BIGINT [(length)] [UNSIGNED] [ZEROFILL] |
8 байт целое (если компилятор поддерживает такой тип) |
BLOB
| Двоичный объект (максимальная длина 65535 байт) |
CHAR(NUM) |
Строка фиксированной длины (1 <= NUM <= 255) |
DATE |
Сохраняет информацию о дате. Использует формат "YYYY-MM-DD". Может
модифицироваться как строка или число, хотя Вы, вероятно, используете
контекст строки для времени и даты.
MySQL тип DATEпонимает по крайней мере следующие синтаксис.
- YYYY-MM-DD (Обратите внимание что '- ' может фактически быть
ЛЮБОЙ не цифрой)
- YY-MM-DD (Обратите внимание что '- ' может фактически быть ЛЮБОЙ не
цифрой)
- YYMMDD
- YYMM
Диапазон для этого типа данных от 0000-00-00 до 9999-12-31. Так что
"проблема 2000" здесь не стоит. В отличие от TIMESTAMP, DATE принимает годы
и в виде двух цифр от 0000 до 0099. Это не очень полезно в большинстве
случаев. Используйте задание лет четырьмя цифрами в полях типа DATE. Тип DATE
имеет длину 4 байта. |
DATETIME |
Объединение типов DATE и TIME. Тип DATETIME идентичен типу TIMESTAMP со
следующими исключениями:
- Когда запись вставляется в таблицу, содержащую поля типа DATETIME,
поле DATETIME не изменяется.
- Диапазон для поля типа DATETIME: '0000-01-01 00:00:00' - '9999-12-31
23:59:59' при использовании в контексте строки, и
'00000000000000' - '99991231235959' при использовании в контексте числа.
Тип DATETIME имеет длину 8 байт. |
DECIMAL (length,dec) |
Десятичное число с плавающей запятой. |
DOUBLE [(length,dec)] |
Число (4 или 8 байт) двойной точности с максимальной длиной и
фиксированном числом десятичных чисел. |
FLOAT [(precision)]
| Номер с плавающей запятой. FLOAT(4) и FLOAT одиночная точность. FLOAT(8)
обеспечивает двойную точность. |
FLOAT [(length,decimals)]
| Число одиночной точности с максимальной длиной и фиксированном числом
десятичных чисел (4 байта). |
INT [(length)] [UNSIGNED] [ZEROFILL] |
Целое (4 байта). |
INTEGER [(length)] [UNSIGNED] [ZEROFILL] |
Целое число 4 байта |
LONGBLOB |
Двоичный объект с максимальной длиной 2**32 байт. |
MEDIUMBLOB |
Двоичный объект с максимальной длиной 16777216 байт. |
MEDIUMINT [(length)] [UNSIGNED] [ZEROFILL] |
Целое (3 байта). |
REAL [(length,dec)] |
Идентично DOUBLE (8 байт). |
SMALLINT [(length)] [UNSIGNED] [ZEROFILL] |
Целое (2 байта). |
TINYBLOB |
Двоичный объект с максимальной длиной 255 байт. |
TINYINT [(length)] [UNSIGNED] [ZEROFILL] |
Целое число (1 байт). |
VARCHAR(NUM) |
Строка переменной длины (1 <= NUM <= 255) |
TIME |
Хранит информацию о времени. Использует формат "HH:MM:SS".
Может использоваться как строка или число. MySQL тип TIME понимает
следующий синтаксис.
Данные типа TIME имеют длину 3 байта. |
TIMESTAMP(NUM) |
Автоматически изменяется при вставке/обновлении. Имеет формат
YYMMDDHHMMSS или YYYYMMDDHHMMSS. Вы можете модифицировать поле TIMESTAMP
при выполнении INSERT. Это полезно, когда Вы хотите установить
произвольную дату/время для записи. В течение модификаций Вы не должны
определять значение для вашего поля TIMESTAMP, или определять NULL как
значение, для вставки. Иначе вы получите недопустимое значение для этого
поля.
Когда используете mysql с ODBC и Access Вы должны использовать значение 14
для NUM, поскольку это заставляет MySQL всегда использовать в годах четыре
цифры. Значение 12 заставит MySQL использовать в году две цифры. Значение
по умолчанию - 14.
Обратите внимание, что в случае таблиц с несколькими полями TIMESTAMP
только первое такое поле будет модифицироваться автоматически. |
Длина поля определяет, сколько всего цифр может иметь число, в то время
как поле dec определяет, сколько из этих цифр будет после десятичной точки.
Эти значения используются только для форматирования и вычисления максимальной
ширины столбца.
MySQL таблица может иметь до 16 ключей, каждый из которых может иметь до
15 полей. Максимальная поддерживаемая длина ключа 120 байт. Вы можете
увеличить длину ключа, изменяя N_MAX_KEY_LENGTH в файле nisam.h и
перекомпилировав пакет. Обратите внимание, что длинные ключи могут привести к
низкой эффективности.
Ключи могут иметь имена. В случае первичного ключа имя будет всегда
PRIMARY. Если имя ключа не задано в процессе создания таблицы, то заданное по
умолчанию имя ключа - первое имя столбца с факультативным суффиксом (_2, _3,
и т. д.) чтобы сделать это имя уникальным. Имя ключа может использоваться с
командой ALTER TABLE, чтобы удалить ключ.
При создании ключа Вы можете факультативно определить, что только
первые N символов поля будут использоваться. Например, если Вы хотите
создавать уникальный ключ на поле, в котором только первые 40 символов
уникальны, можно сделать следующее.
CREATE TABLE SomeTable (composite CHAR(200),
INDEX comp_idx(composite(40)));
Хорошая идея - использовать эту опцию на неуникальных полях, поскольку
эта мера значительно уменьшит размер вашего индекса, а снижение
производительности будет очень не большим.
Вы можете иметь один первичный ключ на таблицу. Если поле определено, как
поле первичного ключа, то генерируется индекс. Нет никакой необходимости
определять нормальный ключ. Кроме того, при определении дополнительных
индексов, которые содержат первичный ключ не будет иметь смысла, поскольку
первичный ключ сделает индекс бесполезным.
Ключи с несколькими полями следует использовать для оптимизации
узкоспецифических запросов. То есть, все поля в предложении WHERE запроса
должны появляться в многопольном ключе.
Поскольку MySQL использует B-Tree не нужно объявлять ключи, которые
являются префиксами других ключей. Оптимизатор найдет любой пригодный для
использования префикс ключа и использует его, чтобы выполнить поиск.
Например, если Вы объявляете следующий ключ:
INDEX (first, second, third, fourth)
Вы также неявно создали следующие ключи:
(first, second, third)
(first, second)
(first)
Объявление ненужных ключей только займет дополнительное место и замедлит
ваши запросы. Ключи должны быть созданы во время создания таблицы или
изменения таблицы с использованием команды ALTER
TABLE.
BLOB - "Binary Large OBject" - двоичный большой объект.
Как отмечено выше, MySQL поддерживает четыре типа BLOB:
tinyblob (0-255 байт)
blob (0-65535 байт)
mediumblob (0-16777216 байт)
longblob (0-2147483648 байт)
Обратите внимание, что могут иметься некоторые ограничения из-за размера
буфера сообщения. Буфер сообщений выделяется динамически. Вы должны знать,
что 'max_allowed_packet' устанавливается на сервере и клиенте. По умолчанию,
это - 64КБ для сервера и 512КБ для клиента.
Вы можете сменить размер буфера, запустив mysqld с опцией
-O. Но помните, что это количество памяти будет выделяться
каждому потоку!
ПРИМЕР:
mysqld -O max_allowed_packet=max_blob_length
MySQL WIN95 ODBC драйвер определяет BLOB как LONGVARCHAR.
Если Вы вставляете двоичные данные в BLOB, Вы не должны применять
следующие символов:
|