Описание СУБД MySQL §1 Особенности MySQL Система управления базами данных (СУБД) MySQL – разработка шведской компании MySQL AB. СУБД MySQL является программным обеспечением с открытым исходным кодом, распространяемым по лицензии GNU (GPL) и коммерческой лицензии для ситуаций, не подпадающих под действие лицензии GPL. MySQL поддерживает реляционную модель данных, т. е. представляет собой реляционную СУБД. Начиная удовлетворяет с версии стандарту 5.0, СУБД MySQL структурированного практически языка запросов полностью SQL и, следовательно, совместима с другими базами данных. Исчерпывающую информацию о диалекте MySQL SQL можно получить в [1, 2] Рассмотрим основные достоинства СУБД MySQL: Высокое качество – MySQL характеризуется устойчивой работой. Наряду с Oracle, MySQL считается одной из самых быстрых СУБД в мире. Открытый код доступен для просмотра и модернизации, что позволяет постоянно улучшать программный продукт. СУБД MySQL, разработанная с использованием языков C/C++, протестирована на многих платформах, среди которых Windows, Linux, FreeBSD, Mac OS X, OS/2, Solaris и др. MySQL поддерживает API (Application Programming Interface, программный интерфейс приложения) для С, C++, Eiffel, Java, Perl, PHP, Python, Ruby и Tcl. MySQL можно успешно применять как для построения Web-страниц с использованием Perl, PHP и Java, так и для работы прикладной программы, созданной с использованием Delphi, Builder C++ или платформы .NET. 3 числе СУБД MySQL предоставляет широкий выбор типов таблиц, в том и сторонних оптимальную для разработчиков, решаемой что задачи позволяет реализовать производительность и функциональность. Локализация в MySQL выполнена корректно. У пользователя, как правило, не возникает проблем при обработке русского содержимого БД На официальном сайте MySQL http://www.mysql.com можно найти доступные для скачивания версии этого продукта. Еще в версии MySQL 4.1 появились такие важные нововведения, как полная поддержка вложенных запросов и поддержка транзакций. А в версии MySQL 5.0 стали доступными следующие важные механизмы: хранимые процедуры и функции, объединяющие в себе целые последовательности запросов; триггеры, т. е. хранимые процедуры, привязанные к событию изменения таблицы; представления – выборки данных, которые можно представить как полноценные реально существующие таблицы базы данных; курсоры, позволяющие цикле просмотреть каждую строку результирующей таблицы запросов; информационная схема, т. е. переносимый набор представлений системной таблицы, в которой хранится разнообразная внутренняя информация. обработчики ошибок; множество новых функций. §2 Запуск MySQL Работа с MySQL начинается с запуска сервера MySQL (основной программы, которая управляет базами данных). Сервер MySQL имеет имя 4 mysqld-nt.exe (в Windows) и mysqld.exe в UNIX-подобных ОС. Если MySQL используется в составе пакета «Денвер» (http://web.dklab.ru), то запуск MySQL-сервера будет осуществлен автоматически при запуске «Денвера». Администрирование СУБД MySQL § 3 Основные утилиты MySQL В стандартном дистрибутиве MySQL поставляются клиентские программы (утилиты), взаимодействующие с MySQL-сервером: mysql (консольный клиент для доступа к MySQL-серверу, позволяющий выполнять SQL-запросы), mysqladmin (утилита для выполнения административных функций, таких как создание или удаление баз данных, получение информации о процессах, состоянии сервера и т. п.), mysqldump (утилита для вывода содержимого базы данных MySQL в виде текстового файла с SQLоператорами), mysqlimport (выполняет перенос информации из текстового файла в таблицы баз данных) и mysqlshow (отображает информацию о существующих базах данных, таблицах, полях и индексах). К утилитам, которые могут функционировать без подключения к серверу MySQL, относятся: myisampack (сжимает таблицы типа MylSAM, уменьшая их в размере и делая доступными только для чтения), mysqlcheck (утилита, используемая для описания, проверки, оптимизации и восстановления таблиц), mysqlbinlog (данная утилита используется для чтения содержимого журнала двоичной регистрации при восстановлении данных в нештатных ситуациях) и perror (утилита, которая выводит расшифровку кодов системных ошибок и ошибок MySQL). Рассмотрим эти средства более подробно. §4 Утилита mysql Консольный клиент mysql часто называют "терминальным монитором" 5 или просто «монитором». В Windows для запуска mysql необходимо перейти в каталог C:\mysql5\bin (конечно, если MySQL установлен в каталог C:\mysql5) и набрать в командной строке имя утилиты. Для соединения с сервером базы данных в параметрах утилиты mysql необходимо указать имя пользователя и его пароль. Например, подключиться к серверу от имени пользователя root можно, набрав команду (пароль root по умолчанию пустой): C:\mysql5\bin>mysql -u root В результате выводится приглашение mysql> за которым можно набирать команды. Команды и SQL-инструкции, за редким исключением (exit, quit, use), должны заканчиваться точкой с запятой. Параметры в утилитах MySQL могут иметь две формы: полную, начинающуюся с двух дефисов (например, --user), и краткую, которая начинается с одного дефиса (например, -u). Можно применять оба варианта, но для ряда параметров имеется только полная форма. Когда пользователь вводит команду, она отправляется на сервер для выполнения, и, если нет ошибок в синтаксисе, на экран выводится результат в виде результирующей таблицы, а на новой строке приглашение mysql>, после которого можно вводить новые команды. Для ввода ключевых слов можно использовать любой регистр символов. Если команда не помещается на одной строке, возможен переход на другую строку, после нажатия клавиши <Enter> — запрос отправляется серверу только после того, как консольный клиент mysql встретит символ точки с запятой. Приглашение командной строки после ввода первой строки этого запроса меняется с mysql > на -> : mysql> SELECT VERSION() 6 -> CURRENT_DATE; Таким образом программа mysql показывает, что завершенного выражения она пока что не получила и ожидает его полного ввода. Точно так же утилита mysql ведет себя, когда ожидает завершения строки, заключенной в двойные или одинарные кавычки: приглашение командной строки меняется с mysql > на ">. Если строка заключена в одинарные кавычки, приглашение меняется на ' >. Для того чтобы отменить текущий запрос, следует ввести последовательность \с. Уже введенные ранее команды не обязательно вводить снова, для этого достаточно их вызвать клавишами «стрелка вверх» и «стрелка вниз», очистить строку запроса можно при помощи клавиши <Esc>. Полный список комбинаций клавиш, которые применяются в редакторе утилиты mysgl, можно увидеть, например, в [1]. Установка соединения с удаленным хостом производится так: C:\mysql5\bin>mysql -u root –h 192.168.200.1 –P 3306 Здесь 192.168.200.1 – IP-адрес хоста, 3306 – номер порта, к которому приписан установленный сервер. Для успешной установки соединения на сервере должны быть прописаны IP-адреса, с которых пользователь может обращаться к MySQL-серверу. Приведем некоторые внутренние команды утилиты mysql. Каждая команда имеет краткую и полную форму: CONNECT (\r). Команда используется в формате (здесь и далее необязательные элементы синтаксиса будут заключаться в квадратные скобки) CONNECT[db_name[host_name]] для подключения к базе данных <db name>, расположенной на хосте host_name. Если имя базы данных и хоста не указаны, вместо них 7 используются значения из текущего сеанса mysql. HELP (\h). Отображает справочную информацию о доступных командах в текущей версии mysql USE (\u). Команда USE db_name позволяет выбрать базу данных db_name для последующей работы с ней. Приведем пример создания таблицы tbl в уже существующей базе dbase: mysql> USE dbase; mysql> CREATE TABLE tbl (number INT, name TEXT); § 5 Утилита mysqladmin В MySQL базы данных представляют собой подкаталоги, расположенные в каталоге данных C:\mysql5\data, имена которых совпадают с именами баз данных. Создание в этом каталоге нового подкаталога аналогично процедуре создания новой базы данных при помощи оператора CREATE DATABASE. Утилита mysqladmin позволяет выполнять операции администрирования баз данных из командной строки, не используя SQLзапросы. С ее помощью можно создавать и уничтожать базы данных; контролировать сервер. При запуске mysqladmin можно задавать как параметры, так и команды, которых может быть несколько. Например, команда mysqladmin –u root create db_name создаст новую базу данных с именем db_name. Полный список команд, которые поддерживаются mysqladmin, приведен в [1, 2] § 6 Утилита mysqldump Утилита mysqldump позволяет получить дамп содержимого базы данных или совокупности баз для создания резервной копии или пересылки 8 данных на другой SQL-сервер (не обязательно MySQL). Дамп будет содержать набор команд SQL для создания и/или заполнения таблиц. Пусть мы имеем готовую базу данных db. Создадим ее дамп: C:\mysql5\bin> mysqldump -u root db > db.sql Утилита mysqldump принимает имя пользователя при помощи параметра -u. Кроме этого, после всех параметров указывается имя базы данных db, для которой осуществляется создание дампа. Так как вывод данных осуществляется в стандартный поток (за которым по умолчанию закреплен экран монитора), его следует перенаправить в файл (в нашем примере это db.sql). Перенаправление данных осуществляется при помощи оператора >. Если вместо оператора > использовать », то данные не будут перезаписывать уже существующий файл, а будут добавлены в конец файла. Mysqldump поддерживает несколько специальных параметров (полный список параметров утилит MySQL можно посмотреть в [1]) К ним относится параметр --databases или в сокращенной форме -В. Данный параметр позволяет создать дамп сразу нескольких баз данных, которые можно перечислить через пробел после него. Так, следующая команда сохраняет дампы баз данных db и mysql в файл db_mysql.sql: С:\mysql5\bin> mysqldump -u root -B db mysql > db_mysql.sql Если необходимо сохранить дамп всех баз данных MySQL-сервера, следует воспользоваться параметром --all-databases или в сокращенной форме –А: mysqldump -u root --all-databases > all_databases.sgl Полученный в результате дамп базы данных представляет собой текстовый файл с SQL-инструкциями, выполнить которые можно при помощи 9 утилиты mysql. При развертывании дампа базы данных удобно воспользоваться следующей командой: mysql –u root db_1 < db.sql Здесь данные из дампа db.sql перенаправляются на стандартный вход утилиты mysql, которая размещает таблицы базы данных db в базе db_1. § 7 Журнальные файлы. Утилита mysqlbinlog MySQL поддерживает несколько видов журнальных файлов, в которых регистрируются различные события, происходящие на MySQL-сервере. В журнал ошибок помещаются сообщения обо всех ошибках, происходящих во время запуска, работы или остановки MySQL-сервера. Общий журнал запросов позволяет регистрировать все ycтановленные клиентом соединения и выполненные запросы. Бинарный журнал регистрации регистрирует все операторы, которые приводят к изменению данных. В Журнал медленных запросов заносятся все запросы, выполнение которых потребовало больше времени, чем указано в системной темной переменной long_query_time (в секундах) Файлы бинарного журнала, которые генерирует сервер, записываются в двоичном формате. Для работы с такими файлами используется утилита mysqlbinlog. Синтаксис вызова утилиты mysqlbinlog выглядит следующим образом: mysqlbinlog [parameters] filename Здесь parameters – параметры утилиты, a filename –имя файла бинарного журнала. Например, для того чтобы отобразить содержимое бинарного журнала binlog.003, можно воспользоваться командой: mysqlbinlog binlog.003 § 8 Утилиты mysqlimport, mysqlshow и mysqlcheck 10 Для пакетной загрузки данных из текстового файла в таблицу в MySQL может быть использована утилита mysqlimport: mysqlimport [параметры] db_name tb1.txt tb2.txt ... Здесь db_name – имя базы данных, с которой будет работать утилита. Далее через пробел указываются имена текстовых файлов, информация из которых будет загружена в таблицы базы данных. При этом имена таблиц должны совпадать с именами этих файлов. Для правильного разделения содержимого текстовых файлов по колонкам таблиц поля записей в них должны быть разделены символом табуляции. Утилита mysqlshow предоставляет средства для быстрого просмотра имеющихся на сервере баз данных, их таблиц, столбцов таблиц и индексов: mysqlshow [параметры] [db_name [tb1_name [col_name]]] После имени утилиты перечисляются параметры, затем указывается имя базы данных db_name, таблица tb1_name и столбец col_name. Если не указана база данных, отображаются все базы данных, просмотр которых разрешен текущему пользователю. Если не указаны таблицы, отображаются все таблицы базы db_name. Если не указаны столбцы, то отображаются все столбцы таблицы tb1_name. В именах баз данных, таблиц и столбцов можно использовать шаблоны: символ «*» или «%» соответствует любому числу символов, символ «?» или «_» – одному произвольному символу. Утилита mysqlcheck проверяет и восстанавливает таблицы типа MyISAM. Для утилиты mysqlcheck существует альтернативная утилита myisamchk. Основное отличие этих двух функций заключается в том, что утилита mysqlcheck должна использоваться при запущенном сервере MySQL, а myisamchk – нет. Существуют три основных способа запуска утилиты mysqicheck: 11 mysqlcheck [parameter] db_name [tables] mysqlcheck [parameter] --databases db_namel [db_name2 db_name3.] mysqlcheck [parameter] --all-databases Если не указываются никакие таблицы tables или используется параметр --databases или --all-databases, будут проверены все базы данных. При вызове утилиты с параметром –-check осуществляется поверка таблиц (значение по умолчанию), при вызове с параметром –-repair – восстановление таблиц, при вызове с параметром –-analyze – анализ таблиц, при вызове с параметром –-optimize – оптимизация таблиц. § 9 Другие средства администрирования MySQL Наряду с перечисленными утилитами при управлении MySQL могут быть использованы специальные операторы SQL, такие как CREATE TABLE, ALTER TABLE, OPTIMIZE TABLE, ANALYZE TABLE, DROP TABLE и др. Однако кроме средств администрирования MySQL из командной строки существуют специальные приложения для управления этой СУБД. Они обладают удобным пользовательским интерфейсом и позволяют производить все перечисленные выше операции, включая, разумеется, и выполнение SQLзапросов. Среди таких программ можно выделить MySQL Administrator, MySQL Query Browser и MySQL Control http://dev.mysql.com/downloads/, Center, а доступные также по адресу phpMyAdmin (http://phpmyadmin.net). Последнее приложение представляет собой систему управления MySQL-сервером через web-интерфейс. Программа phpMyAdmin входит в состав пакета «Денвер», но может использоваться отдельно. 12 Общие вопросы СУБД MySQL § 10 Пользователи MySQL MySQL является многопользовательской средой, поэтому в ней предусмотрена регистрация пользователей, обладающих различными правами (привилегиями). Это могут быть привилегии на просмотр таблицы, на просмотр и добавление новых записей и т. д. Можно позволить пользователю обращаться к серверу MySQL только с определенного хоста и разрешить ему доступ лишь к одному столбцу некоторой таблицы. Словом, MySQL обладает гибкими возможностями предоставления различных прав своим пользователям, что обеспечивает безопасную работу с базами данных. Отметим, что под пользователем MySQL не следует понимать отдельного человека, сидящего за компьютером. Это может быть группа лиц, наделенных одинаковыми правами доступа к серверу MySQL. Информация о зарегистрированных пользователях хранится в таблице user системной базы данных mysql. В системе MySQL существует пользователь root, наделенный правами администратора, т. е. имеющий все возможные привилегии. Создать нового пользователя можно при помощи оператора CREATE USER user [IDENTIFIED BY [PASSWORD] ’password’] В следующем примере при помощи утилиты mysql создается пользователь newuser с паролем hi: mysql> CREATE USER newuser IDENTIFIED BY 'hi' ; Удаление (переименование) пользователей производится с помощью операторов DROP USER и RENAME USER соответственно: DROP USER user; RENAME USER user TO user1; Перечисленные операции могут быть осуществлены и путем прямого 13 редактирования таблицы mysql.user (так обозначается принадлежность таблицы user к базе mysql). Для предоставления (отмены) привилегий отдельным пользователям MySQL поддерживает стандартные операторы SQL GRANT и REVOKE соответственно. Список системных привилегий в MySQL не ограничивается операциями SELECT, INSERT, UPDATE, DELETE и REFERENCES; пользователю могут быть предоставлены права на создание таблиц (CREATE), их редактирование (ALTER), на изменение (создание) хранимой процедуры (ALTER ROUTINE) и т. д. Полный список привилегий приведен в [1] § 11 Типы и структура таблиц Создание, заполнение и изменение таблиц в MySQL осуществляются с помощью стандартных SQL операторов CREATE TABLE, ALTER TABLE, INSERT, UPDATE, DELETE. Определен также оператор REPLASE, который действует аналогично INSERT, но таким образом, что если значение индекса UNIQUE или PRIMARY KEY в старой записи таблицы такое же, как и в новой, то старая запись перед занесением новой будет удалена. Оператор TRUNCATE TABLE предназначен для полного очищения таблицы. Просмотреть список таблиц текущей базы данных позволяет конструкция SHOW TABLES, а получить описание столбцов конкретной таблицы можно при помощи оператора DESCRIBE, который не является стандартным и присутствует лишь в MySQL SQL. СУБД MySQL поддерживает несколько типов таблиц. Тип MyISAM назначается по умолчанию при создании таблицы. Каждая MyISAM-таблица хранится на диске в трех файлах, имена которых совпадают с названием таблицы table_name: table_name.frm, table_name.myd и table_name.myi. Первый из них содержит структуру таблицы и информацию о 14 столбцах и индексах. Второй содержит данные таблицы, а третий – ее индексы. Таблицы типа MyISAM можно переносить с сервера простым копированием файлов. Таблицы типа InnoDB могут достигать объема в 1 Тбайт. Таблицы этого типа хранятся в едином табличном пространстве. Данный тип таблиц поддерживает транзакции, блокировки на уровне отдельных записей и – единственный из типов таблиц MySQL – поддерживает внешние ключи и каскадное удаление (обновление). Впрочем, таблицы InnoDB уступают в скорости обработки таблицам MyISAM. Для создания InnoDB-таблицы применяется ключевое слово ENGINE= InnoDB в операторе CREATE TABLE. Также MySQL поддерживает следующие типы таблиц: MERGE (позволяет сгруппировать несколько таблиц MyISAM в одну), MEMORY (таблица хранится в оперативной памяти), EXAMPLE, BDB, NDB Cluster (для организации кластеров распределенных таблиц), ARCHIVE (для хранения больших объемов информации в сжатом виде), CSV (формат таблиц Ms Excel), FEDERATED (для хранения данных на удаленном компьютере), BLACKHOLE. § 12 Типы данных в MySQL MySQL поддерживает несколько типов данных. Числовые данные. К ним относят целые числа, не содержащие дробной части (например, 124), а также вещественные числа, имеющие как целую, так и дробную части (например, 56.45). Числовые данные делятся на точечные (bit, boolean, integer и decimal) и приближенные (float, real и double precision). MySQL имеет пять целых типов: TINYINT, SMALLINT, MEDIUMINT, BIGINT. Различие между ними заключается в диапазоне величин, которые можно хранить в столбцах такого типа. Тип TINYINT имеет диапазон от –27 15 до 27–1, тип SMALLINT – от –215до 215–1, тип MEDIUMINT – от –223 до 223– 1, тип BIGINT – от–263до263–1. Целые типы данных могут быть объявлены положительными. Для этого предназначено ключевое слово UNSIGNED. В этом случае элементам данного столбца нельзя будет присвоить отрицательные значения, а допустимый диапазон значений, которые может принимать тип, удваивается. При объявлении целого типа можно задать количество отводимых под число разрядов (от 1 до 255). Тип BIT предназначен для хранения битовых полей. Тип BOOLEAN является синонимом для TINYINT (1). Значение 1 рассматривается как истина (true), a 0 – как ложь (false). Тип DECIMAL, а также его синонимы NUMERIC и DEC предназначены для величин повышенной точности, например, для денежных данных. Требуемая точность задается при объявлении данных одного из этих типов, например: DECIMAL(5,2). Здесь цифра 5 определяет общее число символов, отводимых под число, а цифра 2 задает количество знаков после запятой. При этом первый параметр может принимать максимальное значение, равное 64, а второй – максимальное значение, равное 30. Для представления вещественных (приближенных) типов в СУБД MySQL имеются типы: FLOAT (диапазон от –3.4Е+38 до 3.4Е+38, точность 1.2Е–39), DOUBLE и DOUBLE PRECISION (–1.8Е+308 до 1.8Е+308, точность 2.2Е–308). Числовые типы данных с плавающей точкой также могут иметь параметр UNSIGNED. Как и в целочисленных типах, этот атрибут предотвращает хранение в отмеченном столбце отрицательных величин, но, в отличие от целочисленных типов, максимальный интервал для величин столбца остается прежним. 16 При формировании структуры таблицы необходимо обращать внимание на размер, занимаемый тем или иным типом данных: если значения в полях столбца никогда не будут выходить за пределы 100, не следует выбирать тип больше TINYINT. Если же предполагается хранить только целочисленные данные, то применение атрибута UNSIGNED позволит увеличить диапазон в два раза. Строковые данные— последовательность символов, заключенных в одинарные или двойные кавычки: 'Hello world', '123', "MySQL". Поскольку в качестве стандарта в SQL определены одинарные кавычки, для совместимости с другими базами данных рекомендуется использовать именно их. Различают строковые типы CHAR, VARCHAR, BLOB, TEXT, MEDIUMTEXT, MEDIUMBLOB, LONGTEXT, LONGBLOB, ENUM, SET. Тип CHAR позволяет хранить строку фиксированной длины; его дополняет тип VARCHAR, позволяющий хранить строки переменной длины. Длина строки может изменяться от 0 до 65 535. При создании таблицы нельзя смешивать столбцы типа CHAR и VARCHAR. В этом случае СУБД MySQL изменит тип столбцов согласно правилу: если таблице присутствует хотя бы один столбец переменной длины, все столбцы типа CHAR будут приведены к типу VARCHAR. Тип TEXT обычно используется для хранения больших объемов текста (до 216 –1 символов), в то время как BLOB (также до 216 –1 символов) — для больших двоичных объектов, таких как электронные документы, изображения, музыкальные файлы и т. п. Типы MEDIUMBLOB, MEDIUMTEXT имеют максимальный размер (224 – 1) символов, а типы LONGTEXT, LONGBLOB – (232 –1) символов. К особым типам данных относятся ENUM и SET. Строки этих типов принимают значения из заранее заданного списка допустимых значений. 17 Основное различие между ними заключается в том, что значение типа ENUM должно содержать точно одно значение из указанного множества, тогда как столбцы SET могут содержать любой (или все) элементы заранее заданного множества. Так, значения для столбца, объявленного как ENUM ('y', 'n'), могут принимать значения либо 'y', либо 'n'. Для типа SET, так же как и для типа ENUM, при объявлении задается список возможных значений, но в ячейке таблицы может храниться любое значение из списка, а пустая строка означает, что ни один из элементов списка не выбран. Например, значения для столбца SET ('y', 'n') могут принимать значения ('y', 'n'), ('y'), ('n') и пустое множество ( ). Календарные данные. СУБД MySQL имеет пять календарных типов данных: DАТЕ, DATETIME, TIME, TIMESTAMP и YEAR. Тип DАТЕ предназначен для хранения даты, TIME — для времени суток, a TIMESTAMP — для представления и даты, и времени суток. Тип TIMESTAMP предназначен для представления даты и времени суток в виде числа секунд, прошедших с полуночи 1 января 1970 года. Тип данных YEAR позволяет хранить только год. Для значений, имеющих тип DATE и DATATIME принят формат YYYY-MMDD или YY-MM-DD. В типах TIME и DATATIME время приводится в привычном формате hh:mm:ss. Если время задается в недопустимом формате, то в поле записывается нулевое значение. Нулевое значение присваивается полям временного типа и по умолчанию, когда им не присваивается инициирующее значение. Тип NULL. Если поле может принимать значение NULL, то в определении столбца после типа данных следует указать ключевое слово NULL. Если ни при каких обстоятельствах поле не должно принимать значение NULL (регистрация невозможна, если фамилия пользователя неизвестна), следует указать ключевое слово NOT NULL, например: 18 CREATE TABLE tbl ( id INT NOT NULL, col_name VARCHAR(255) NOT NULL, ); При выборе типа данных следует помнить, что обработка числовых данных происходит быстрее строковых. Так как типы данных ENUM и SET имеют внутреннее числовое представление, им следует отдавать предпочтение перед другими видами строковых данных, если предоставляется такая возможность. Типы фиксированной длины обрабатываются быстрее типов переменной длины, т. к. в последнем случае при частых удалениях и модификациях таблицы происходит ее фрагментация. § 13 Индексы в MySQL Определение индекса по некоторому столбцу означает, что СУБД создает его копию, которая затем постоянно поддерживается в отсортированном состоянии. Поиск по такому столбцу осуществляется очень быстро, т. к. заранее известно, где необходимо искать нужное значение. Индекс может быть определен по одному или по нескольким столбцам; в одной таблице может быть несколько индексов. MySQL поддерживает несколько видов индексов: первичный ключ — главный индекс таблицы; обычный индекс — таких индексов может быть несколько; уникальный индекс — значения в индексируемом столбце не должны повторяться (уникальных индексов также может быть несколько), полнотекстовый индекс— специальный вид индекса для столбцов типа TEXT, позволяющий производить полнотекстовый поиск. Индексы могут иметь как собственные имена, так и имена индексируемых столбцов. Один индекс может охватывать один или несколько столбцов. 19 В таблице MySQL может быть не более 32 индексов, а многостолбцовый индекс может включать не более 16 столбцов. В качестве первичного ключа может выступать не только целочисленный столбец, но и текстовые данные. В этом случае при создании таблицы необходимо добавить в круглых скобках число символов, входящих в индекс: PRYMARY KEY(name(10)). Можно индексировать от 1 до 1000 символов текстового столбца. Первичный ключ может быть объявлен не по одному столбцу: PRIMARY KEY(id_PC, name(10)). Целочисленный первичный AUTO_INCREMENT, который ключ может обеспечивает быть снабжен автоматическое атрибутом создание уникального значения:: id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT Передача столбцу, снабженному этим атрибутом, значения NULL или 0 приводит к автоматическому присвоению ему максимального значения столбца плюс 1. Данный механизм является весьма удобным и позволяет не заботиться о генерации уникального значения средствами прикладной программы, работающей с СУБД MySQL. Значение AUTO_INCREMENT можно изменить и начать отсчет не с 1, а, например, с 1000. Объявление обычных индексов производится при помощи ключевого слова INDEX или KEY: …name TINYTEXT NOT NULL KEY name (name(10))… Для уникальных индексов вводится дополнительное ключевое слово UNIQUE, т. е. пишется UNIQUE INDEX и UNIQUE KEY: Создание обычных индексов, в отличие от первичного ключа и уникального индекса, допустимо для столбцов, снабженных атрибутом NULL. Для обычных индексов (в отличие 20 от первичного ключа) недопустимо их определение вместе со столбцом. Ссылочная целостность и внешние ключи в СУБД MySQL поддерживаются, начиная с версии 3.23.44, но только для таблиц типа InnoDB. Отметим, что MySQL поддерживает операторы CREATE INDEX и DROP INDEX для создания (удаления) индексов после определения таблиц. § 14 Транзакции Под транзакцией понимают выполнение группы SQL-запросов как единой операции. Иными словами либо выполняются все эти запросы, либо (если на каком-то этапе произошел сбой) отменяются все результаты их работы. Транзакции выполняются независимо друг от друга, т. е. до завершения транзакции блокируется доступ к объектам базы данных, подвергаемым обработке. Транзакции поддерживаются в MySQL для таблиц типа BDB и InnoDB. Транзакции не могут быть вложенными, т.к. всякий оператор, начинающий новую транзакцию, завершает предыдущую. По умолчанию MySQL работает в режиме автоматического завершения транзакций, т. е. после выполнения всякого запроса, модифицирующего данные, результат сразу записывается в базе. Для объединения нескольких операторов в транзакцию можно отключить этот режим, используя системную переменную AUTOCOMMIT: mysql> SET AUTOCOMMIT=0; После этого для завершения транзакции (и сохранения изменений) следует использовать оператор COMMIT, а для отмены всех действий – оператор ROLLBACK, например: mysql> SET AUTOCOMMIT=0; mysql> INSERT INTO table VALUES (val1, val2); mysql> SELECT * FROM table; 21 mysql> ROLLBACK; mysql> INSERT INTO table VALUES (val3, val4); mysql> SELECT * FROM table; mysql>COMMIT; mysql> SET AUTOCOMMIT=1; Объединить последовательность запросов в транзакцию можно также с использованием стандартного оператора SET TRANSACTION: mysql> SET TRANSACTION mysql> INSERT INTO table VALUES (value1, value2); mysql> SELECT * FROM table; mysql>COMMIT; Наконец, в MySQL (для таблиц InnoDB) существует еще одна возможность определить транзакцию: операторы SAVEPOINT и ROLLBACK TO SAVEPOINT. Первый из них устанавливает именованную точку начала транзакции; второй позволяет в случае необходимости сделать откат к состоянию, в котором находилась база в момент установки именованной точки. Если выполняется оператор COMMIT или ROLLBACK без указания имени точки возврата, все именованные точки удаляются. Например: mysql> SAVEPOINT mypoint; mysql> INSERT INTO table VALUES (value1, value2); mysql> SELECT * FROM table; mysql> ROLLBACK TO SAVEPOINT mypoint; §15 Функции и операторы в MySQL СУБД MySQL поддерживает большинство стандартных логических и битовых операторов, операторов сравнения и, конечно же, арифметические операции, среди которых целочисленное деление «div» и взятие остатка от деления «%». Если при перемножении целых чисел результат выходит за 22 пределы типа BIGINT, то возвращается 0. Деление на 0 в MySQL не приводит к ошибке: возвращается значение NULL. Как и другие СУБД, MySQL обладает большим числом встроенных функций, среди которых математические, функции даты и времени, функции работы со строками, функции шифрования данных и многие другие. Полный список этих функций можно увидеть в [1]. Следует отметить, что синтаксис MySQL не допускает использования пробела между именем функции и круглыми скобками, которые обязательны даже в случае отсутствия аргументов. MySQL и РНР § 16 Создание простого сценария на PHP Для работы с MySQL используются различные языки программирования, в числе которых Perl, Java, C++, Python и др. Опишем взаимодействие СУБД MySQL (предпочитаемую многими хост-провайдерами) и языка PHP как наиболее популярного средства создания Интернет-приложений. Напомним, что Интернет работает по принципу «клиент-сервер». Клиент (обычно браузер) посылает запрос серверу, сервер обрабатывает запрос и посылает клиенту ответ. Запрашиваемый браузером URL может указывать на статическую htmlстраницу (в этом случае содержимое страницы отобразится на экране браузера) или на скрипт, т.е. специальную программу, которая выполняется на сервере и генерирует содержимое страницы, посылаемой обратно в браузер. Скрипту может быть передана некоторая информация, например, данные html-форм. Простой скрипт на языке РНР выглядит как html-документ со вставками кода, исполняемого на сервере. Для написания и отладки скриптов на локальном компьютере необходимо установить web-сервер Apache, а также сопутствующее ПО. Весьма удобно 23 использовать систему «Денвер», которая включает в себя Apache, PHP, MySQL, Perl и другие средства, применяемые при разработке web-приложений. Базовый пакет «Денвера» можно скачать по адресу http://web.dklab.ru После запуска «Денвера» на компьютере создается виртуальный диск (обычно Z), содержащий каталоги etc, home, tmp, usr. В каталоге home следует создать новую папку, чье имя совпадает с именем будущего виртуального хоста, например myhost.ru (или myhost). В созданном каталоге необходимо поместить папку www, в которой и будут располагаться скрипты (сценарии). Для того чтобы создать новый виртуальный хост необходимо перезапустить «Денвер». Теперь обратиться к сценарию myscript.php, расположенному в папке Z:\home\myhost.ru\www можно из строки браузера следующим образом: http://myhost.ru/myscript.php Если скрипт имеет имя index.php, то он вызывается по умолчанию: http://myhost.ru/ Пусть на сервере уже существует база данных DB, содержащая таблицу tbl. Таблица tbl содержит два столбца: id_name (первичный ключ с атрибутом AUTO_INCREMENT) и name. Создадим сначала файл connect.php, который можно будет включать в любые РНР-сценарии для соединения с базой DB. Файл connect.php <?php //начало кода php $hostname='имя_xocтa'; // создание переменной //$hostname $user='имя_пользователя'; // создание переменной // $user $pass='пароль'; // создание переменной 24 // $pass $DBname='DB'; // создание переменной // $DBname $db_connection=mysql_connect($hostname,$user,$pass); // установление соединения с сервером MySQL mysql_select_db($DBname); // выбор базы данных ?> //конец кода php Переменные $hostname и $user хранят имя и пароль одного из пользователей, зарегистрированных в MySQL. В качестве имени хоста может указываться localhost. В переменной $db_connection хранится ссылка на созданное соединение. Большинство функций РНР для работы с MySQL принимают ее в качестве необязательного аргумента. Выполнение SQL-запросов к базе данных выполняется в php–сценариях следующим образом: $query='SQL-запрос'; $query_result=mysql_query($query); В переменной $query_result хранится ссылка на результат выполнения запроса, т. е. указатель на данные, возвращенные MySQL. Создадим сценарий index.php, который выводит html-форму, заносит в базу данных введенную в нее информацию и выводит содержимое базы в браузер. Файл index.php. <HTML> <? php //Если форма отправлена, //обработать ее: if (isset($_POST['submit'])) { // подключить файл connect.php: include_once("connect.php"); 25 $name=$_POST['name']; //«взять» в переменную $name //строку, переданную из //поля html-формы name //Создать запрос: $query="INSERT INTO tbl VALUES (NULL,'$name')"; // Выполнить запрос: $query_result=mysql_query (Squery); //выполнить самопереадресацию: Header("Location: {$_SERVER['SCRIPT_NAME']}?".time()); exit(); //вывести данные из таблицы DB в браузер $query_result=mysql_query('SELECT * FROM tbl'); while ($row=mysql_fetch_array($query_result)){ echo'name:'.$row[1].'<br>\n'; } } else { //Если форма не отправлена, //вывести ее: для упрощения кода //выйти из режима интерпретатора РНР: ?> <form action="index.php" method="post"> Введите имя <input type="text" name="name" size="30"/><br> <input type="submit" name="submit" value="Отправить!" /> </form> <?php } // Конец главного условного оператора. ?> 26 </html> Рассмотрим некоторые детали этого скрипта. Данные, переданные webсерверу с помощью html-формы методом POST, доступны в php-сценариях как элементы массива $_POST, например $_POST['submit']. Запрос INSERT INTO tbl VALUES (NULL,'$name') используется для вставки новой записи в таблицу. Применение NULL в данном случае повлечет за собой присвоение атрибуту id_name очередного порядкового номера. Самопереадресация (указание браузеру перейти заново к адресу текущего скрипта) после процедуры вставки данных необходима для того, чтобы при нажатии кнопки «обновить» в браузере только что добавленные данные не добавлялись в базу повторно. Функция mysql_fetch_array() возвращает по одной строке результат выборки данных в виде массива. Цикл while ($row=mysql_fetch_array($query_result)) выполняется до тех пор, пока есть еще данные. Элемент массива $row[1] является вторым (содержит значение name), т.к. нумерация элементов массива в РНР начинается с 0. Подробную информацию о программировании на РНР можно почерпнуть в [4]. ЛИТЕРАТУРА 1. Кузнецов М. В., Симдянов И. В. MySQL5.– СПб.: БХВ-Петербург, 2006. – 1024 с. 2. Компания MySQL АВ. MySQL. Справочник по языку – М.: Издательский дом "Вильямс", 2005. – 432 с. 3. Ульман Л. MySQL– М.: ДМК Пресс; СПб.: Питер, 2004. – 352с. 27 4. Котеров Д. В., Костарев А. Ф. PHP5. .– СПб.: БХВ-Петербург, 2005. – 1120 с. 28