MySQL. Библиотека профессионала - Аткинсон Л
..pdf222Глава Инструкции SQL
Влистинге 13.24 приведены результаты инструкции DESCRIBE. В первых двух лонках указаны имя и тип каждого столбца. В колонке "Null" будет стоять если столбец допускает значения NULL. Для столбцов, являющихся частью первичного ключа, в четвертой колонке будет стоять PRI. Если же столбец входит в состав друго го индекса, то в этой колонке будет указано В пятой колонке отображается зна чение по умолчанию. В последней колонке приводится дополнительная информация
остолбце. В частности, здесь указывается, является ли столбец
mysql> DESCRIBE
DROP DATABASE
Инструкция DROP DATABASE удаляет базу данныхиз системы:
DROP DATABASE [IF EXISTS] имя
Вместе с базой данных удаляются все таблицы и вся хранимая информация. Спе цификация IF EXISTS подавляет вывод сообщения об ошибке, выдаваемого в случае, если указанная база данных не существует.
Базы данных реализованы в виде каталогов, содержащих файлы данных и индек сов. Инструкция DROP DATABASE удаляет в заданном каталоге все файлы, созданные программой MySQL. Другие файлы остаются. Если каталог пуст, он тоже удаляется. Таким образом, можно удалить все таблицы, но сама база данных останется, если в ней есть посторонние файлы. Удаление соответствующего каталога файловой систе мы тоже приводит к удалению базы данных.
Таблицы типа нужно удалять вручную.
Полныйсписокинструкций 223
DROP FUNCTION
Инструкция DROP FUNCTION удаляет из памяти код функции, загруженной с по мощью инструкции CREATE FUNCTION:
DROP FUNCTION имя
DROP INDEX
Инструкция DROP INDEX удаляет индекс таблицы, выполняя для этого инструк цию ALTER TABLE:
DROP INDEX имя ON таблица
DROP TABLE
Инструкция DROP TABLE удаляет все файлы, относящиеся к таблице. Она имеет следующий синтаксис:
DROP TABLE [IF EXISTS] |
таблица |
[RESTRICT | CASCADE] |
Спецификация IF EXISTS подавляет вывод сообщения об ошибке, выдаваемого в случае, если заданная таблица не существует. Можно указывать несколько имен таб лиц, разделяя их запятыми.
Флаги RESTRICT и CASCADE игнорируются в MySQL версии 3.23. Они предназна чены для выполнения сценариев, созданных в другихСУБД.
В листинге 13.25 демонстрируется удаление двух таблиц: и log.
DROP TABLE IF EXISTS message, log
EXPLAIN
Инструкция EXPLAIN описывает способ указанного запроса или же эмулируетинструкциюDESCRIBEдлязаданнойтаблицы:
EXPLAIN I
Вкачестве запроса разрешается вводить любую допустимую инструкцию SELECT.
Врезультате будет выдана таблица с описанием индексов, используемых для выпол нения операции объединения. Благодаря этому можно узнать, влияют ли индексы на повышение производительности объединений. Подробнее об оптимизации запросов рассказывается в главе 26, "Оптимизация". В листинге 13.26 показаны типичные ре выдаваемые инструкцией EXPLAIN.
224 Глава Инструкции SQL
mysql> EXPLAIN
SELECT *
FROM user, WHERE
Таблица, возвращаемая инструкцией EXPLAIN, содержит одну строку для каждой таблицы в порядке их упоминания. В первой колонке приводится имя таблицы, во второй—типобъединения. Возможныследующие типы:ALL, const, index, range, ref, system.
Тип ALL означает полное сканирование таблицы. Обычно для такой таблицы тре буется индекс.
Тип const означает, что в таблице есть одна совпадающая запись, а тип system указывает на таблицу, состоящую из одной записи. В обоих случаях программа MySQL может хранить запись в памяти в течение всего времени выполнения запроса, что приведет к повышению производительности.
Тип eq_ref означает ссылку по равенству, т.е. для каждой комбинации записей предыдущих таблиц из данной таблицы извлекается одна запись. В большинстве слу чаев это наилучший тип с точки зрения производительности.
Тип index означает, что сканированию подлежит весь индекс. Это почти так же плохо, как и тип ALL, но чуть быстрее, поскольку количество элементов индекса обычно меньше, чем число записей в таблице.
Тип range указывает на то, что условию отбора может удовлетворять подмноже ство записей и каждую из них придется сканировать на каждом проходе.
Тип ref означает, что условию отбора будет удовлетворять подмножество запи сей, но для ссылки на них используется индекс. Этоимеет место в том случае, когда адресуется индексируемый столбец, допускающий дублирующиеся значения.
Вколонке possible_keys перечислены индексы, которые могут быть использо ваны для повышения эффективности запроса. Здесь может стоять NULL.
Вколонке key показаны задействованные индексы. Здесь тоже может стоять NULL. В колонке key_len сообщается о том, сколько частей составного ключа ис пользуется.
Вколонке ref приводится список столбцов или констант, с помощью которых осуществлялся отбор записей. В колонке rows отображается число записей, участ вующих в запросе.
Вколонке Extra приводитсядополнительная информация об объединении. Ключевое
слово Distinct говорит о том, что MySQL перестает сканировать записи при нии первого совпадения. Сообщение Not exists означает, что программа вала левое внешнее пропустив последующие операции сканирования для совпавшей комбинации. Сообщение range checked each record выдается, когда
Полный список инструкций 225
ни один из индексов не устроил программу полностью, т.е. на каждом этапе сканирования используются разные индексы. Сообщение Using указывает на необходимость дополнительного прохода для сортировки таблицы результатов. Сообщение Using index означает, что информация о столбцах извлекалась только из индексов, т.е. не пона добилось искать сами записи. Сообщение Using temporary говорит о необходимости создания временной таблицы. Если же в колонке Extra содержится ообщениес Where used, значит, для отбора записейбыло использовано предложение WHERE.
FLUSH
Инструкция FLUSH очищает внутренние кэш буферы MySQL, используемые для ус корения запросов. После имени инструкции можно указывать произвольное число имен буферов, разделенных запятыми:
FLUSH буфер
Существуют пять очищаемых буферов: HOSTS, LOGS, PRIVILEGES, TABLES и STATUS.Нижеописаныспецификации буферов.
HOSTS
Это кэш имен компьютеров и адресов Internet. Когда компьютер меняет свой IP адрес, данный буфер нужно очистить. Это также позволит заново установить соеди нения, которые ранее были отменены из за превышения лимита ошибок.
LOGS
Очистка данного буфера приводит к закрытию и повторному открытию всех нальных файлов. Нумерованные файлы получат новые номера.
PRIVILEGES
Очистка данного буфера приведет к повторной загрузке таблиц привилегий в базу данных Это необходимо делать после ручного редактирования таблиц. Инст рукции GRANT и REVOKE не требуют очистки буфера.
STATUS
Очистка этого буфера приводит к сбросу большинства значений, сообщаемых ин струкцией SHOW TABLE STATUS. Данное действие производит глобальный эффект.
TABLES [имя,
Если после имени TABLES не указан список таблиц, будут закрыты все таблицы, в противном случае — лишь те, что перечислены.
TABLES WITH READ LOCK
Данная спецификация означает закрытие всех таблиц и их блокирование с помощью инструкции LOCK TABLES. Это полезно, когда требуется выполнить резервное ние всей базы данных. Снять блокировки можно с помощью инструкции UNLOCK TABLES.
226 Глава Инструкции SQL
GRANT
Инструкция GRANT предоставляет пользователям требуемые привиле гии, создавая учетную запись пользователя в случае необходимости. Общий формат
инструкции таков: |
|
GRANT тип |
тип |
ON таблица |
|
ТО |
[IDENTIFIED BY пароль] |
пользователь |
[IDENTIFIED BY пароль] |
[WITH GRANT OPTION] |
|
Возможные типы привилегий перечислены в табл. 13.3. Привилегии выдаются в за висимости от контекста: глобально, для конкретной базы данных, таблицы или столбца. Некоторые привилегии имеют смысл лишь в определенном контексте. К примеру, для
столбцов допустимы привилегии INSERT, SELECT и UPDATE. К таблицам и базам данных применимы эти же привилегии, плюс ALTER, CREATE, DELETE, DROP и INDEX.
щие привилегии являются глобальными: FILE, PROCESS, RELOAD и SHUTDOWN.
Тип |
Описание |
ALL |
Пользователю предоставляются все права, кроме права |
PRIVILEGES |
передачи привилегий |
ALTER |
Пользователь может вводить инструкцию ALTER TABLE |
CREATE |
Пользователь может создавать таблицы и базы данных |
DELETE |
Пользователь может вводить инструкцию DELETE |
DROP |
Пользователь может удалять таблицы и базы данных |
FILE |
Пользователь получает доступ к файлам на локальном диске и |
|
может выполнять репликацию |
INDEX |
Пользователь может добавлять и удалять индексы |
INSERT |
Пользователь может вводить инструкцию INSERT |
PROCESS |
Пользователь может просматривать список активных пото |
|
ков и удалять потоки |
REFERENCES |
Никак не интерпретируется в версии 3.23 |
RELOAD |
Пользователь может очищать кэш буферы |
SELECT |
Пользователь может создавать запросы к таблицам |
SHUTDOWN |
Пользователь может останавливать работу сервера |
UPDATE |
Пользователь может вводить инструкцию UPDATE |
USAGE |
Пользователь не имеет никаких прав и может лишь |
|
рироваться на сервере |
Полный список инструкций 227
Предложение ON и список столбцов задают контекст привилегии. Таблица может идентифицироваться по собственному имени либо в сочетании с именем базы данных. Метасимвол * соответствует всем объектам диапазона. Например, запись * оз начает выдачу привилегий для всех таблиц базы данных store (листинг 13.27). ный символ * соответствует всем таблицам текущей базы данных. В случае записи * * привилегииявляютсяглобальными.
GRANT SELECT, INSERT, UPDATE, DELETE
ON
TO
WITH GRANT OPTION
Имя пользователя — это строка длиной не более 16 символов. Если вслед за этим именем стоят символ @ и сетевое имя, то привилегия применима только тогда, когда пользователь регистрируется на сервере с указанного компьютера. Имена пользова теля и компьютера необходимо заключать в кавычки, когда в них присутствуют мета символы. Например, запись 1еоп@% обозначает пользователя под ключающегося с любого компьютера домена Вместо сетевого имени может стоять и IP адрес. Если же узел вообще не указан, то информация о том, какому узлу принадлежит пользователь, не будет учитываться.
Предложение IDENTIFIED BYзадает пароль пользователя. Если учетная запись пользователя уже существует, его пароль меняется. Задать пароль можно также с по мощьюинструкцииSET.
Спецификация WITH GRANT OPTIONS разрешает пользователю предоставлять аналогичные привилегиидругим пользователям.
Инструкция GRANTS выводит список привилегий, которыми владеет поль зователь.
INSERT
Инструкция INSERT добавляетзаписивтаблицу.Еесинтаксистаков:
INSERT |
[LOW_PRIORITY | DELAYED] [IGNORE] |
[INTO] |
таблица |
|
| запрос | |
|
SET |
Можно задавать строки в виде набора литеральных значений или в виде таблицы результатов запроса. В первом случае порядок следования значений соответствует порядку столбцов, указанному в определении таблицы либоздесь же, в круглых скоб ках после имени таблицы. Предложение SET позволяет явно указывать, к какому столбцу относится конкретное значение.
Флаг LOW_PRIORITYговоритотом,чтооперациявставки должнабытьотложенадо того момента, пока не будут закончены все операциичтения. Во время самой вставки на
таблицу накладывается жесткая блокировка. Поскольку таблицы типа |
допуска |
ют одновременные вставки, использовать флаг LOW_PRIORITY нежелательно. |
|
228 Глава Инструкции SQL
Клиентская программа блокируется до момента завершения инструкции INSERT, что не всегда удобно. Флаг DELAYED отменяет такую установку, помещая инструкцию INSERT в очередь и немедленно возвращая управление программе. Этот флаг приме ним лишь к таблицам типа
Флаг IGNORE подавляет вывод сообщений об ошибках, выдаваемых в случае обна ружения дубликатов. Обычно, если вставляемая запись нарушает целостность вичного ключа или ограничение уникальности, отменяется вся операция вставки. При наличии флага IGNORE дублирующаяся запись будет отброшена, и операция должится. Длязамены дубликатов воспользуйтесь инструкциейREPLACE.
Тип вводимого значения должен соответствовать типу столбца, которому оно сопос тавлено. Список, приводимый после имени таблицы, может содержать имена столбцов в произвольном порядке. Столбцам, не указанным в списке, будут присвоены значения по умолчанию. Например, в записывается следующее целое число.
После ключевого слова VALUES в скобках приводится набор значений, разделен ных запятыми. Разрешается в одном предложении VALUES вводить значения сразу для нескольких записей, что запрещено в стандарте (листинг 13.28).
INSERT IGNORE
INTO team (Name)
VALUES
В списке значений могут присутствовать выражения. В состав выражений могут входить ссылки на вставляемые столбцы, но лишь на те из них, которые упоминаются раньше. В листинге 13.29 демонстрируется вставка записи с одновременным вычис лением текущего года и среднего значений четырех столбцов.
INSERT |
|
|
|
INTO |
performance |
Q2, Q3, |
Mean) |
VALUES |
0.15, 0.07, |
0.13, 0.24, |
|
В предложении SET указывается список имен столбцов и соответствующих им зна чений. В этом случае список столбцов после имени таблицы не нужен (листинг 13.30).
INSERT IGNORE
INTO team
SET
С помощью подчиненной инструкции SELECT можно отобрать группу записей для вставки в таблицу (листинг 13.31). Стандарт языка SQL запрещает ссылаться на одну и ту же таблицу в главной и подчиненной инструкции.
Полный список инструкций 229
INSERT IGNORE
INTO team |
(Name) |
SELECT Name |
|
FROM |
a |
WHERE |
|
AND |
|
KILL
Инструкция KILL разрывает соединение с базой данных. Ей передается иденти фикатор потока:
KILL поток
Все потоки пронумерованы. Инструкция SHOW PROCESSLIST отображает список активных потоков. Обычно пользователь имеет право уничтожать только свои венные потоки, но с помощью привилегии PROCESS ему можно разрешить удалять любые потоки.
LOCK TABLES
С помощью инструкции LOCK TABLES можно запретить другим потокам осущест влять запись в ту или иную таблицу. Синтаксис инструкции таков:
LOCK TABLES таблица [AS псевдоним] |
[LOCAL] | |
|
таблица [AS псевдоним] |
[LOCAL] |
| [LOW_PRIORITY] |
Инструкция LOCK TABLE ожидает бесконечно долго, пока требуемые блокировки не будут получены. В ней указывается список имен таблиц, разделенных запятыми. После каждого имени задается тип блокировки: READ (нежесткая) или WRITE (жесткая). Нежесткая блокировка запрещает запись в таблицу всем потокам, включая тот, кому она принадлежит. Жесткая блокировка разрешает доступ к таблице для чтения и записи только потоку владельцу.
В листинге 13.32 показан пример блокирования двух таблиц. Из таблицы team из влекается максимальное значение поля Score, которое заносится в переменную Далее это значение вставляется в таблицу record, после чего обе таблицы раз
блокируются.
LOCK TABLES team t READ, record WRITE;
SELECT
FROM team
INSERT INTO record VALUES
UNLOCK TABLES;
230 Глава 13. Инструкции SQL
Для таблицы может быть задан псевдоним, и пока блокировка не снята, таблице нельзя назначать в запросах другие псевдонимы. Если таблица участвует в запросе под несколькими псевдонимами, ее придется заблокировать определенное число раз под соответствующими именами.
Флаг LOCAL разрешает выполнять инструкции INSERT, не приводящие к конфлик там. Но в этом случаефайлы, содержащие табличные данные, становятся доступными для записи, из за чего появляется угроза нарушения целостности данных.
делает приоритет запросов на получение жестких блокировок более низким, чем у запросов на получение нежестких блокировок. В этомслучае кая блокировка будет предоставлена только тогда, когда нет отложенных нежестких блокировок. Обычно же запросы первого типа имеют более высокий приоритет.
Для снятия блокировок предназначена инструкция UNLOCK TABLES. Кроме того, блокировки снимаются при завершении потока или вводе другой инструкции LOCK TABLES. Подробнее о блокировках рассказывалось в главе 9, "Транзакции и парал лельные вычисления". С блокировками связаны также функции GET_LOCK и RELEASE_LOCK описанныевглаве12,"Встроенные функции".
LOAD DATA INFILE
Инструкция LOAD DATA INFILE читает данные из текстового файла и вставляет их в указанную таблицу. Ниже показан общий формат этойинструкции:
LOAD DATA |
[LOCAL] |
INFILE путь [IGNORE | REPLACE] |
INTO TABLE таблица |
|
|
[FIELDS |
[TERMINATED BY |
|
|
ENCLOSED |
BY |
[ESCAPED BY |
|
|
[LINES |
TERMINATED |
BY |
[IGNORE |
LINES] |
|
Флаг |
говорит о том, что процесс импорта данных должен быть от |
ложен, пока не завершатся все операции чтения таблицы. Если отсутствует флаг LOCAL, файл открывается на сервере, в противном случае — в клиентской файловой системе. Для открытия файла на сервере следует иметь привилегию FILE.
Обычно необходимо указывать полное путевое имя файла. Неполные путевые имена вычисляются относительно каталога данных MySQL. Как правило, это каталог Файл, не имеющий путевого имени, открывается в каталоге базы данных, которая задана по умолчанию, например
В случае импорта записей, нарушающих целостность первичного ключа или огра ничение уникальности, будут выдаваться сообщения об ошибке, подавляемые при личии флага IGNORE или REPLACE. Флаг IGNORE приводит к отбрасыванию непра вильных записей, а флаг REPLACE означает замену существующих записей. Флаг LOCAL подразумевает наличие флага IGNORE, поскольку сервер не может запретить клиенту посылать данные.
Влистинге 13.33 демонстрируется загрузка содержимого файла .
втаблицу team.
Полный список инструкций 231
LOAD DATA INTO TABLE team
FIELDS TERMINATED BY OPTIONALLY ENCLOSED BY ESCAPED BY
LINES TERMINATED BY IGNORE 1 LINES
(Name, ID)
По умолчанию программа MySQL ожидает, что поля файла разделяются символа ми табуляции, а специальные символы защищаются от интерпретации с помощью об ратной косой черты. Предложение FIELDS позволяет изменять этиустановки.
В спецификации TERMINATED BY указывается разделитель полей. Спецификация ENCLOSED BY задает символ (обычно кавычку), который используется для дополни тельного обособления значений. Флаг не играет никакой роли.
Спецификация ESCAPED BY задает символ, который будет отменять специальное назначение управляющих символов. Ограждающие символы разрешается просто уд ваивать. Например, если все поля файла заключаются в двойные кавычки, то для вставки кавычки в поле можно записать либо что одно и то же.
Каждое поле входного файла считается строкой. Строки легко преобразуются в числа, но если тип столбца задан как ENUM или SET, то такое преобразование не будет правильным. Следовательно, элементы перечислений и множеств должны иметь строковый тип.
По умолчанию строки заканчиваются символом новой строки, выбор которого диктуется операционной системой. В UNIX это символ перевода строки. С помощью спецификации LINES TERMINATED BY можно задать другой конечный символ. Если
в спецификации LINES |
TERMINATED BY указана пустая строка, а в спецификации |
FIELDS TERMINATED |
строки. |
Если требуется импортировать файл с полями фиксированного размера, нужно задать разделители полей и строк пустыми. В этом режиме предполагается, что раз меры полей соответствуют спецификациям столбцов, а сами поля никак не отделяют
ся друг от друга. Например, для столбца типа CHAR |
будут запрошены ближайшие 8 |
символов файла. Этот режим не подходит для столбцов типа TEXT и BLOB, а также для |
файлов, содержащих многобайтовые символы.
С помощью предложения . можно пропустить требуемое число строк файла. Это позволяет импортировать файлы, содержащие заголовки данных.
Если данные загружаются лишь в некоторые столбцы, то в конце инструкции дол жен быть задан список столбцов. Он необходим также в томслучае, когда порядок по лей входного файла не соответствует порядку столбцов таблицы. Пропущенным столбцам будут присвоены стандартные значения.
По умолчанию значения NULL записываются как \N. Если используются ограничи вающие кавычки, то значения NULL вводятся в явном виде, причем без кавычек (с ка вычками это будет воспринято как строка To же самое справедливо и для случая, когда управляющий символ незадан.
Инструкция SELECT позволяет записывать табличные данные в файл. Для этого в ней предусмотрено предложение INTO.