Программирование >>  Создание клиентов mysql 

1 ... 159 160 161 [ 162 ] 163 164 165 ... 201


Устранение тимостей 501

Помимо внутренних объединений, создаваемых с помощью предложения WHERE, в MySQL используются специальные операторы объединений в предложении FROM. Например, поддерживается оператор LEFT JOIN. В других СУБД подобного рода операторы, такие как * = или { +), применяются в предложении WHERE.

Имена функций существенно различаются в зависимости от СУБД. Встроенные функции MySQL были перечислены вглаве 12, Встроенные функции . Замену обычно найти несложно. Например, в Oracle текущее время хранится в переменной SYSDATE, в MS SQL Server оно определяется с помощью функции GETDATE (), а в MySQL-с помощью функции NOW().

Для совместимости с другими СУБД в MySQL создан ряд псевдонимов. В частности, имеется функция SYSDATE (), эквивалентная одноименной системной переменной Oracle. Поддерживаются также функции ODBC.

В MySQL реализован механизм транзакций, но лишь для некоторых типов таблиц. К ним не относится стандартный тип MylSAM, по крайней мере в версии 3.23. Отдельные SQL-инструкции выполняются в атомарном режиме, поэтому, если формировать собственные транзакции не нужно, таблицы MylSAM вполне подойдут.

Для таблиц тех типов, которые поддерживают транзакции, ведутся журналы транзакций. На их основе работают инструкции COMMIT и ROLLBACK. Если сервер внезапно зависает и его приходится принудительно перезапускать, прежнее состояние таблиц автоматически восстанавливается по журналу и целостность данных не нарушается. Таблицы MylSAM могут повреждаться из-за сбоев сервера. Обычно администраторы MySQL регулярно выполняют соответствующие проверки. Можно также настроить сервер на проверку всех таблиц при каждом запуске.

В MySQL таблицы блокируются при помощи инструкции LOCK TABLES. Есть СУБД, которые позволяют блокировать таблицу в инструкции SELECT. О вопросах блокировки рассказывалось в главах 9, Транзакции и параллельные вычисления , и 13, Инструкции SQL .

В главе 9 речь также шла об имитации последовательностей. В MySQL нет отдельного объекта, отвечающего за выделение уникальных идентификаторов. Вместо этого первичный ключ помечается специальным флагом, благодаря которому ему будут автоматически присваиваться целые числа. Кроме того, можно смоделировать последовательность с помощью таблицы, состоящей из одной ячейки. Обратимся к табл. 28.4. В левой части приведена инструкция Oracle, которая создает последовательность с интервалом приращения 5, начинающуюся с числа 50. В правой части показаны эквивалентные инструкции MySQL.

Oracle

/* Создание последовательности */

CREATE SEQUENCE invoice seq INCREMENT BY 5 START WITH 50;

MySQL

/* Создание последовательности */ CREATE TABLE invoice seq { nextvalINT

INSERT INTO invoice seq VALUES (50);



Oracle

/* Получение следующего значения * /

SELECT invoice seq.nextval;

MySQL

/* Получение следующего значения UPDATE invoice seq SET nextval = LAST IN-

SERT ID(nextval+5); SELECT LAST INSERT ID{);

В MySQL не поддерживаются подчиненные запросы, т.е. инструкции SELECT, взятые в скобки и входящие в состав других инструкций SELECT. Обычно сложную инструкцию можно переписать так, чтобы удалить подчиненный запрос. Воспользуйтесь временными таблицами и блокировками. Если подчиненный запрос применяется для проверки того, входит ли запись в заданное множество, используйте методику, описанную выше для предиката EXISTS.

При работе с утилитой sql подчиненный запрос можно сымитировать, создав файл сценария с текстом запроса. Представим себе таблицу, в которой хранятся сообщения интерактивного форума. Раз в месяц старые сообщения переносятся в архив и удаляются из главной таблицы. Таблица archive содержит идентификаторы всех записей таблицы message, которые сохраняются в архивном файле. Чтобы получить список удаляемых сообщений, нужно извлечь их идентификаторы из таблицы archive. В листинге 28.3 демонстрируется удаление записей таблицы message, соответствующих записям таблицы archive. Сначала с помощью функцииCONCAT () создается группа инструкций, содержащих идентификаторы сообщений. В результате формируется таблица, состоящая из одного столбца. Затем благодаря предложению INTO OUTFILE этатаблица сохраняется в фай del. sql. Таким образом, будет получен SQL-сценарий, содержащий одну инструкцию в каждой строке. В конец каждой строки добавляется точка с запятой. Сценарий загружается с помощью команды source, которая является частью интерпретатора mysql. Она загружает указанный файл и последовательно выполняет содержащиеся в нем инструкции, как если бы они были набраны в командной строке. При взаимодействии с сервером программным путем этот этап необходимо реализовать самостоятельно.

Сохранение таблицы в текстовом SELECT CONCAT С DELETE FROM message WHERE ID=, FROM archive

INTO OUTFILE /tmp/mydeLsql;

/* Загрузка и выполнение файла инструкций. */ source /tmp/raydel.sql

MessagelD,

Некоторые СУБД позволяют непосредственно управлять указателями наборов записей. Такие указатели можно перемещать с помощью инструкций SQL. В MySQL указатели используются самой программой и недоступны на уровне инструкций. В то же время результаты запроса можно извлекать построчно с помощью функций библиотеки языка С.





Устранение тотимостей 503

В большинстве реляционных СУБД поддерживаются хранимые процедуры и пользовательские функции. Они пишутся на специальных языках сценариев, таких как PL/SQL ил ct-SQL. В MySQL аналогичного языка нет. Существуют два способа имитации хранимых процедур тервых, соответствующие функции можно реализовать в приложениях, а можно писать функции MySQL на языке С

(об этом рассказывается в глав 31, Расширение возможностей MySQL ).

С хранимыми процедурами связана и концепция триггеров. СУБД выполняет триггерные процедуры при наступлении определенных событий. Это позволяет накладывать на таблицу произвольные ограничения целостности. Как правило, это каскадные удаления, когда удаление родительской записи приводит к удалению всех ее потомков . Ограничения налагаются также на значения столбцов. Такие столбцы удобно определять с помощью типа ENUM, задавая набор допустимых строк. Соответствующий пример показан в листинге 28.4. Разработчики MySQL планируют в будущем включить впрограмму поддержку каскадных удалений.

CREATE TABLE member (

ID INT (5) NOT NULL AUTO INCREMENT, Name CHAR (16) NOT NULL, Department ENUM(

Command,

Engineering,

Science) NOT NULL, PRIMARY KEY(ID)

В MySQL распознаются инструкции CREATE TABLE, содержащие определения внешних ключей, хотя эти определения отбрасываются при создании таблицы. грамма не пытается контролировать целостность внешних ключей. В документации приводятся веские доводы в пользу такого шага. Считается, что целостность межтабличных связей должна контролироваться приложениями.

Представление - это инструкция SELECT, которая получила имя и выглядит как таблица. Представления необходимы для того, чтобы заставить пользователей обращаться к некоторым таблицам строго определенным образом и без возможности новления. Планируется, что представления появятся в MySQL версии 4.1, а пока что запрет записи в таблицу реализуется только посредством привилегий.

Некоторые СУБД используют фиксированный порядок сортировки записей, а в других СУБД этот порядок указывается перед созданием базы данных. MySQL не учитывает регистр символов в операциях сравнения, но эту установку можно отменить, задав в определении столбца флаг BINARY. Существует также оператор приведения типа BINARY, описанный в главе 12, Встроенные функции . Порядок сортировки двоичных строк определяется используемым набором символов. По умолчанию это

В MySQL существуют операторы REGEXP и NOT REGEXP, позволяющие сравнивать строку с регулярным выражением. Некоторые СУБД разрешают указывать регулярные выражения в операторе LIKE, но в MySQL концепция регулярных выражений реализована в полном объеме.



1 ... 159 160 161 [ 162 ] 163 164 165 ... 201

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика