Документация на MySQL

         

ALTER TABLE


СИНТАКСИС:

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. См. . Если вы удаляете column_name, которое является частью составного ключа, то часть ключа будет удалена. Если все части ключа удалены, то будет удален весь ключ. DROP PRIMARY KEY удаляет первый уникальный ключ в таблице. CHANGE делает лучшее преобразование существующей информации в новый формат. Синтаксис DROP FOREIGN KEY пока существует для запланированных функциональных возможностей. В настоящее время не делает ничего.

Вы можете использовать функцию C API mysql_info(&MYSQL_RESULT) чтобы узнать, сколько записей скопировано и сколько удалено из-за дублированных ключей.

Для использования команды ALTER TABLE вы должны иметь права доступа select, insert, delete, update, create и drop для этой таблицы.



BaseName


Удаляет путь из полного имени файла.

СИНТАКСИС:

static char *BaseName (pathname) char *pathname;

ОПИСАНИЕ:

Параметр pathname является указателем на полное имя файла. Функция размещает в памяти короткое имя файла и возвращает указатель на него.



Библиотека отладчика MySQL




Библиотека отладчика, используемая MySQL была первоначально написана Фредом Фишом (Fred Fish). Она будет очень полезна, если Вы планируете отлаживать и/или добавлять функциональные возможности к СУБД MySQL.

Автор зачем-то приводит заголовок файла dbug.c из исходников пакета (вместе со всеми комментариями к нему). Приведу его и я, поскольку это может быть продиктовано какими-либо юридическими проблемами с копирайтом. Поскольку я не юрист, привожу этот заголовок без какого-либо перевода (во избежание ошибок или искажения смысла юридического документа при переводе).

/************************************************************************* * N O T I C E * * * * Copyright Abandoned, 1987, Fred Fish * * * * This previously copyrighted work has been placed into the public * * domain by the author and may be freely used for any purpose, * * private or commercial. * * * * Because of the number of inquiries I was receiving about the use * * of this product in commercially developed works I have decided to * * simply make it public domain to further its unrestricted use. I * * specifically would be most happy to see this material become a * * part of the standard Unix distributions by AT&T and the Berkeley * * Computer Science Research Group, and a standard part of the GNU * * system from the Free Software Foundation. * * * * I would appreciate it, as a courtesy, if this notice is left in * * all copies and derivative works. Thank you. * * * * The author makes no warranty of any kind with respect to this * * product and explicitly disclaims any implied warranties of mer- * * chantability or fitness for any particular purpose. * ************************************************************************* */ /* * FILE * dbug.c runtime support routines for dbug package * * SCCS * @(#)dbug.c 1.25 7/25/89 * * DESCRIPTION * These are the runtime support routines for the dbug package. * The dbug package has two main components; the user include * file containing various macro definitions, and the runtime * support routines which are called from the macro expansions. * * Externally visible functions in the runtime support module * use the naming convention pattern "_db_xx...xx_", thus * they are unlikely to collide with user defined function names. * * AUTHOR(S) * Fred Fish (base code) * Enhanced Software Technologies, Tempe, AZ * asuvax!mcdphx!estinc!fnf * * Binayak Banerjee (profiling enhancements) * seismo!bpa!sjuvax!bbanerje * * Michael Widenius: * DBUG_DUMP - To dump a piece of memory. * PUSH_FLAG "O" - To be used instead of "o" if we don't * want flushing (for slow systems) * Check of malloc on entry/exit (option "S") */



BLOB'ы


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.



Быстрая загрузка данных


Самый быстрый способ загружать данные в MySQL - команда LOAD DATA INFILE. Это в 3-20 раз быстрее, чем использование инструкций INSERT. Для еще большего количества быстродействия Вы можете использовать следующую процедуру, чтобы отключить формирование ключа на вашей таблице, в то время как данные загружаются. Для этого надо находиться в вашем MySQL каталоге баз данных, или обеспечивать полные пути к вашей базе данных.

isamchk -rq -k0 [имя_базы_данных]/[имя_таблицы] Удаление ключей
LOAD DATA INFILE ... Чтение Ваших данных
isamchk -rq [имя_базы_данных]/[имя_таблицы] Создание ключей таблицы заново
mysqladmin reload. Сообщите, чтобы mysql использовал новую таблицу



ChangeOwner


Меняет владельца на реального пользователя для suid программ.

СИНТАКСИС:

static VOID ChangeOwner (pathname)

ОПИСАНИЕ:

Для Unix-систем, меняет владельца недавно созданного файла отладки на реального владельца. Это нужно в случаях выполнения программ, запущенных с правом доступа set-user-id.

Обратите внимание, что владелец файла уже установлен на момент выдачи этой команды. Так что, если она выполняется без права доступа set-user-id, то эта команда смысла не имеет (но безобидна).



Чем хорош MySQL?


Перечислю основные приятные стороны пакета MySQL.

Многопоточность. Поддержка нескольких одновременных запросов. Оптимизация связей с присоединением многих данных за один проход. Записи фиксированной и переменной длины. ODBC драйвер в комплекте с исходником Гибкая система привилегий и паролей. До 16 ключей в таблице. Каждый ключ может иметь до 15 полей. Поддержка ключевых полей и специальных полей в операторе CREATE. Поддержка чисел длинной от 1 до 4 байт (ints, float, double, fixed), строк переменной длины и меток времени. Интерфейс с языками C и perl. Основанная на потоках, быстрая система памяти. Утилита проверки и ремонта таблицы ( isamchk). Все данные хранятся в формате ISO8859_1. Все операции работы со строками не обращают внимания на регистр символов в обрабатываемых строках. Псевдонимы применимы как к таблицам, так и к отдельным колонкам в таблице. Все поля имеют значение по умолчанию. INSERT можно использовать на любом подмножестве полей. Легкость управления таблицей, включая добавление и удаление ключей и полей.



Чем отличается реализация протокола клиент/сервер в MySQL от своего аналога в mSQL?


Имеются значительные различия. Среди них:

Буфер сообщений может содержать много строк результатов. На стороне сервера размер буфера сообщений динамически подстраивается по мере необходимости для больших запросов пользователя. Все пакеты пронумерованы, для синхронизации пакетов. Все столбцы представлены в ASCII, длина столбцов и длины строк представлены с помощью двоичного кодирования (1, 2 или 3 байта). MySQL может читать результаты без буферизации. Если одна запись/чтение занимает свыше 30 секунд, сервер закрывает соединение. Если соединение неактивно в течение 8 часов, сервер закрывает соединение.



Что можно почитать


DBI(3) для информации об использовании DBD/DBI.

домашняя страничка DBI,

домашняя страничка mysql,

домашняя страничка msql.



Что такое MySQL?


MySQL разработал Михаэль Видениус (Michael Widenius, ). MySQL является относительно небольшой и быстрой реляционной СУБД основанной на традициях Hughes Technologies Mini SQL (mSQL).

Последнюю версию MySQL можно скачать с .



Что такое SQL?


SQL - это сокращение от Structured Query Language (структурированный язык запросов). SQL создан для работы с реляционными базами данных. Он позволяет пользователям взаимодействовать с базами данных (просматривать, искать, добавлять и управлять данными). MySQL соответствует спецификации ANSI 92 SQL. Подробности.



CloseFile


Закрывает поток вывода отладчика.

СИНТАКСИС:

static VOID CloseFile (fp) FILE *fp;

ОПИСАНИЕ:

Закрывает поток вывода отладчика, если это не stdout или stderr.



Comp_err


Генерирует файлы сообщений об ошибках на национальном языке.

СИНТАКСИС:

comp_err [-?] [-I] [-V] fromfile[s] tofile

ОПИСАНИЕ:

Эта программа используется для компиляции текстовых файлов которые содержат соответствие между кодами ошибок mysql и текстовыми сообщениями об этих ошибках в формат, который понимает mysql. Это нужно для изменения уже существующего файла сообщений или генерации такого файла для другого языка.

ПРИМЕР:

comp_err share/english/errmsg.txt share/english/errmsg.sys



Connect


$dbh = Mysql->Connect; $dbh = Mysql->Connect($host); $dbh = Mysql->Connect($host,$database); $dbh = Mysql->Connect($host,$database,$password); $dbh = Mysql->Connect($host,$database,$password,$user);

Эта команда устанавливает соединение с сервером и базой данных. Без аргумента или с пустой строкой в качестве первого аргумента он связывается с устройством UNIX /dev/mysql, который сильно повышает эффективность. Имя базы данных во втором аргументе указывает с какой именно базой данных надо связаться. Возвращается дескриптор базы данных, если команда Connect выполнена успешно. В противном случае возвращаемое значение не определено. Если Вы используете mysqld, скомпилированный с библиотекой потоков MIT, Вы не сможете использовать устройства. В этом случае укажите имя сервера в переменной host. А вообще библиотека потоков MIT такое глюкало...

Можно указать имя пользователя и пароль. Если имя пользователя не указано, используется текущий логин. Если не указан пароль, а пользователь его имеет, связь установить не получится.

Возвращаемый дескриптор нужен для обращения к базе данных. Можно отдать несколько команд Connect переменных ($dbh1,$dbh2, $dbh3, ...)

Из полученного дескриптора можно извлечь сведения о имени сервера, порте и имени базы данных:

$scalar = $dbh->sock; $scalar = $dbh->host; $scalar = $dbh->database;

Имя базы данных не определено, если при вызове команды Connect было указано только имя сервера.



CREATE INDEX


СИНТАКСИС:

CREATE [UNIQUE] INDEX index_name ON table_name (column_name,... )

ОПИСАНИЕ:

В MySQL эта команда проверит был ли данный индекс создан, когда создавалась таблица. Она не создает индекс. Это предусмотрено по причинам совместимости. Если Вы хотите добавить, ключ используйте команду .



CREATE TABLE


СИНТАКСИС:

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:]].


DataSeek


Позиционируется на произвольную позицию в данных.

СИНТАКСИС:

DataSeek $sth $row_number;

ОПИСАНИЕ:

Дает возможность Вам определить смещение в данных, связанное с операторным дескриптором. Следующий вызов FetchRow возвратит соответствующую строку (первая строка имеет смещение = 0).



_Db_doprnt_


Печать дескриптора строк отладки.

СИНТАКСИС:

VOID _db_doprnt_ (format, va_alist) char *format; va_dcl;

ОПИСАНИЕ:

Когда вызывается через одну из DBUG макрокоманд, проверяет текущий набор ключевых слов, вызывая _db_pargs_() чтобы узнать, была ли эта макрокоманда выбрана для обработки через строку управления отладчика, и если так, печатает аргументы с помощью форматированной строки. Номер строки DBUG макрокоманды в источнике найден в u_line.

Обратите внимание, что строка формата (format) НЕ ДОЛЖНА включить завершение строки (\n), это делается автоматически.



_Db_dump_


Выполняет дамп строки, пока не найдет '\0'.

СИНТАКСИС:

void _db_dump_ (_line_,keyword,memory,length) int _line_; current source line number char *keyword; char *memory; Memory to print int length; Bytes to print

ОПИСАНИЕ:

Выполняет дамп N символов в двоичный массив. Используется, чтобы исследовать разрушенную память или массивы.



_Db_enter_


СИНТАКСИС:

VOID _db_enter_ (_func_, _file_, _line_, _sfunc_, _sfile_, _slevel_, _sframep_) char *_func_; points to current function name char *_file_; points to current file name int _line_; called from source line number char **_sfunc_; save previous _func_ char **_sfile_; save previous _file_ int *_slevel_; save previous nesting level char ***_sframep_; save previous frame pointer

ОПИСАНИЕ:

Вызывается в начале каждой функции пользователя, чтобы сообщить отладчику, что была введена новая функция. Обратите внимание, что указатели на предыдущее имя функции пользователя и предыдущее имя файла пользователя сохраняются в стеке вызовов (это причина того, почему макрокоманда ENTER должна быть первым "выполнимым" кодом в функции, так как она распределяет память для этой области. Предыдущий уровень вложения также сохраняется в стеке вызовов для внутренней самопроверки непротиворечивости.

Также печатает строку трассировки, если трассировка включена и увеличивает текущее значение глубины вложения функций.

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



_Db_keyword


Проверяет ключевое слово на членство в списке ключевых слов.

СИНТАКСИС:

BOOLEAN _db_keyword_ (keyword) char *keyword;

ОПИСАНИЕ:

Проверяет ключевое слово на членство в списке ключевых слов. Как и в случае со строками, все ключевые слова принадлежат пустому списку. Когда отладка не включена, никакие ключевые слова не принимаются. После того, как максимальный уровень трассировки превышен, никакие ключевые слова тоже не принимаются. Дополнительно, текущая функция и текущий процесс должны входить в соответствующие списки.

Возвращает TRUE, если ключевое слово входит в список, и FALSE в противном случае.



_Db_longjmp_


Восстановить предварительно сохраненное окружение отладчика.

СИНТАКСИС:

VOID _db_longjmp_ ()

ОПИСАНИЕ:

Вызывается как часть макрокоманды пользователя DBUG_LONGJMP, чтобы восстановить среду отладчика параллельно с восстановлением предварительно сохраненной среды пользователя.



_Db_pargs_


Параметры файла протокола для последующего использования _db_doprnt_().

СИНТАКСИС:

VOID _db_pargs_ (_line_, keyword) int _line_; char *keyword;

ОПИСАНИЕ:

Новая универсальная макрокоманда печати DBUG_PRINT, которая заменяет все формы макрокоманд DBUG_N, нуждается в двух обращениях к подпрограммам поддержки во время выполнения. Первая, это функция, которая запоминает параметры, которые используются последующим обращением для _db_doprnt_().



_Db_pop_


ОПИСАНИЕ:

Извлекает из стека отладки последнее записанное туда состояние отладки и устанавливает в него состояние отладки. Обратите внимание, что извлечение будет терпеть неудачу, если оно удалит последнее имеющее силу состояние из стека. Это предотвращает ошибки пользователя в последовательности действий со стеком из отладчика.



_Db_push_


Поместить в стек текущее состояние отладчика, и установить новое.

СИНТАКСИС:

VOID _db_push_ (control) char *control;

ОПИСАНИЕ:

По указателю в параметре "control" на строку управления отладкой помещает в стек текущее состояние отладки, анализирует строку управления и устанавливает новое состояние отладки.

Единственный атрибут нового состояния, унаследованного из предыдущего состояния, это текущая функция вложенного уровня. Это может быть отменено, используя флажок "r" в строке управления.

Строка управления отладкой является последовательностью полей, разделенных двоеточиями:

<field_1><field_2><field_N>

Каждое поле состоит из обязательного символа флажка отладки, сопровождаемого факультативным "," и списком параметров, разделенных запятыми:

flag[,modifier,modifier,...,modifier]



_Db_return_


СИНТАКСИС:

VOID _db_return_ (_line_, _sfunc_, _sfile_, _slevel_) int _line_; current source line number char **_sfunc_; where previous _func_ is to be retrieved char **_sfile_; where previous _file_ is to be retrieved int *_slevel_; where previous level was stashed

ОПИСАНИЕ:

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



_Db_setjmp_


Сохранить окружение отладчика.

СИНТАКСИС:

VOID _db_setjmp_ ()

ОПИСАНИЕ:

Вызывается как часть макрокоманды пользователя DBUG_SETJMP, чтобы сохранить среду отладчика параллельно с сохранением среды пользователя.



DbugExit


Выводит сообщение об ошибке и завершает работу.

СИНТАКСИС:

static VOID DbugExit (why) char *why;

ОПИСАНИЕ:

Выводит сообщение об ошибке, используя текущее имя процесса, причина прерывания выполнения (обычно мало памяти), и выходит с 1 состоянием. Это должно быть изменено, чтобы использовать при выходе код состояния, определенный в отладчике пользователя. Но это будет в следующих версиях.



DbugMalloc


Выделяет память для библиотек поддержки отладчика.

СИНТАКСИС:

static long *DbugMalloc (size) int size;

ОПИСАНИЕ:

Выделяет дополнительную память для библиотек поддержки отладчика. Сбой при распределении запрошенного число байтов фатален для текущего процесса. Это довольно недружелюбное поведение. Лучше просто печатать предупреждающее сообщение, замораживать текущее состояние отладчика, и продолжать выполнение. Но это в следующей версии (может быть)...



DelayArg


Преобразует параметр флажка D к системному стандарту.

СИНТАКСИС:

static int DelayArg (value) int value;

ОПИСАНИЕ:

Преобразует время задержки, задаваемое в десятых долях секунды, к системному стандарту. Например, на Amiga, имеется системный вызов "Delay()" который получает параметр в импульсах таймера (50 в секунду). На Unix команда sleep работает с числом секунд. Таким образом, значение "10", для задержки в течение одной секунды, преобразуется в 50 на Amiga, и 1 на Unix. Другие системы будут должны использовать цикл синхронизации.



DELETE


СИНТАКСИС:

DELETE FROM table_name WHERE where_definition

Здесь where_definition имеет формат:

where_definition: where_expr or where_expr [AND | OR] where_expr

where_expr имеет формат:

where_expr: column_name [> | >= | = | <> | <= | < ] column_name_or_constant or column_name LIKE column_name_or_constant or column_name IS NULL or column_name IS NOT NULL or (where_definition)

ОПИСАНИЕ:

Удаляет записи из таблицы.

Возвращает количество обработанных записей. Если вызван DELETE без WHERE, то таблица будет очищена. В этом случае DELETE вернет 0 для числа обработанных записей.

Замечания:

Все строки сравниваются без учета регистра (ISO_8859_1). Если Вы должны сделать чувствительный к регистру поиск, то используйте REGEXP в предложении HAVING. LIKE применим на числовых столбцах. Сравнение с явным NULL (столбец == NULL) эквивалентно условию IS NULL, то есть использованию (столбец IS NULL). Это было сделано, для совместимости с mSQL.

Вы должны иметь права доступа delete для удаления записей.



DESCRIBE


СИНТАКСИС:

(DESCRIBE | DESC) table [column]

ОПИСАНИЕ:

Описывает таблицу или столбец. Эта команда подобна команде . Факультативный параметр [column] может быть именем столбца или строкой. Если [column] - строка, он может содержать символы подстановки.



Добавление функций в MySQL


Если Вы понимаете C++, и Yacc, то относительно просто добавить функцию к СУБД MySQL. Если не понимаете, то дело хуже.

Сначала добавьте строку в файл sql_lex.cc с именем функции в массив sql_functions.

Затем добавьте две строки в файл sql_yacc.y. Первая определяет символ препроцессора yacc. Вы должны добавить это к началу файла. Затем определите параметры функции, и создайте 'item' с этими параметрами.

В файле item_func.h объявляют класс, который наследуется из Item_num_func или Item_str_func, в зависимости от того, возвращает ли ваша функция число или строку.

В intem_func.cc добавьте:

double *Item_func_newname::val()

если Вы определяете числовую функцию, или

String *Item_func_newname::Str(String *str)

если Вы определяете строковую функцию.

Для строковой функции вы должны также определить следующую функцию:

void Item_func_newname::fix_length_and_dec()

Она должна по крайней мере вычислить 'max_length' основанный на полученных параметрах. max_length - максимальное число символов, которое функция может вернуть (максимальная длина возвращаемого значения).

Если функция не может возвращать null, Вы должны также установить 'maybe_null=0'.

Для строковых функций параметр 'String *str', предоставляет буфер для хранения результата. Строковая функция должна вернуть строку, которая хранит результат.

Все строковые функции должны избегать выделения памяти больше, чем им абсолютно необходимо! Системные ресурсы не бесконечны...



DoPrefix


Вывести префикс строки отладки.

СИНТАКСИС:

static VOID DoPrefix (_line_) int _line_;

ОПИСАНИЕ:

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



DoProfile


Проверяет разрешено ли профилирование.

СИНТАКСИС:

static BOOLEAN DoProfile()

ОПИСАНИЕ:

Проверяет разрешено ли профилирование, не достигнута ли еще максимальная глубина трассировки, текущая функция выбрана и текущий процесс выбран. Возвращает TRUE, если все в порядке, и FALSE в противном случае.



DoTrace


Проверка разрешения на трассировку.

СИНТАКСИС:

static BOOLEAN DoTrace (stack)

ОПИСАНИЕ:

Проверяет разрешена ли трассировка, не достигнута ли еще максимальная глубина трассировки, текущая функция выбрана и текущий процесс выбран. Возвращает TRUE, если все в порядке, и FALSE в противном случае.



Драйвер MySQL DBD Perl


Этот драйвер представляет собой второй способ обратиться к базе данных MySQL из программы на perl.

В настоящее время эта часть описания интерфейса с perl только немного переработана, относительно версии стандартной pod-документации. Данная часть описания изготовлена с помощью команды pod2html -mke.

Обзор:

use DBI; $dbh = DBI->connect( $host, $database, $user, 'mysql' [, $password] ); # or $dbh = DBI->connect('', '', '', 'mysql', {hostname => "localhost", port => 3333, database => "test", username => "myname", password => "mypassword",});

ПРИМЕР:

#!/usr/bin/perl use DBI; $drh = DBI->install_driver('mysql'); $dbh = $drh->connect('','test','','') or die "Error connecting to database"; $dbh->do("DROP TABLE foo"); $dbh->do("CREATE TABLE foo ( Field_1 VARCHAR(60) )"); $count = 1; while ($count < 500) { $sth = $dbh->prepare("INSERT INTO foo VALUES('XXXYYYZZZ')"); $sth->execute; $sth->finish; # Очень важно вызвать finish, иначе не освободится память. print "$count\n" unless $count % 10; $count = $count + 1; }



DROP


СИНТАКСИС:

DROP TABLE table_name [table_name ...]

ОПИСАНИЕ:

Удаляет (в оригинальной документации почему-то сказано, что роняет) одну или несколько таблиц.

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

ОСТЕРЕГАЙТЕСЬ! DROP TABLE полностью удалит именованную таблицу(ы) из вашей системы. Не предусмотрено никакого UNDO или UNERASE (если Вы не имеете резервной копии, конечно).

Вы должны иметь права доступа delete, чтобы использовать DROP.



Двоичные данные в BLOBS


Если Вы вставляете двоичные данные в BLOB, Вы не должны применять следующие символов:

\0 \\ ' или "



FetchCol


Возвращает массив, содержащий один столбец, состоящий из значений.

СИНТАКСИС:

@arr = $sth->FetchCol($col);

ОПИСАНИЕ:

Возвращает массив значений для столбца номер $col. FetchRow возвращает следующую строку результата запроса. FetchCol возвращает весь одиночный столбец результата запроса.

Обратите внимание, что эта функция сбросит текущий указатель строки на конец таблицы; вы должны использовать DataSeek(0), чтобы переустановить его.



FetchHash


Возвращает результат запроса.

СИНТАКСИС:

%hash = $sth->FetchHash;

ОПИСАНИЕ:

Возвращает ассоциативный массив, содержащий следующую строку, полученную с сервера.



FetchRow


Возвращает строку результатов.

СИНТАКСИС:

@arr = $sth->FetchRow;

ОПИСАНИЕ:

Возвращает массив значений следующей строки, полученной с сервера.



FreeList


Освободить всю память, занятую элементами списка.

СИНТАКСИС:

static VOID FreeList (linkp) struct link *linkp;

ОПИСАНИЕ:

Параметр linkp указывает на первый элемент связанного списка. Освобождается вся память, занятая элементами списка и самим списком.



Функции


select_expression может содержать следующие функции и операторы:

+ - * / Арифметические действия.
% Остаток от деления (как в C)
| & Битовые функции (используется 48 бит).
- Смена знака числа.
( ) Скобки.
BETWEEN(A,B,C) (A >= B) AND (A <= C).
BIT_COUNT() Количество бит.
ELT(N,a,b,c,d) Возвращает a, если N == 1, b, если N == 2 и т. д. a,b,c,d строки.

ПРИМЕР:

ELT(3,"First","Second","Third","Fourth")
вернет "Third".

FIELD(Z,a,b,c) Возвращает a, если Z == a, b, если Z == b и т. д. a,b,c,d строки.

ПРИМЕР:

FIELD("Second","First","Second","Third","Fourth")
вернет "Second".

IF(A,B,C) Если A истина (!= 0 and != NULL), то вернет B, иначе вернет C. IFNULL(A,B) Если A не null, вернет A, иначе вернет B. ISNULL(A) Вернет 1, если A == NULL, иначе вернет 0. Эквивалент ('A == NULL'). NOT ! NOT, вернет TRUE (1) или FALSE (0). OR, AND Вернет TRUE (1) или FALSE (0). SIGN() Вернет -1, 0 или 1 (знак аргумента). SUM() Сумма столбца. = <> <= < >= > Вернет TRUE (1) или FALSE (0). expr LIKE expr Вернет TRUE (1) или FALSE (0). expr NOT LIKE expr Вернет TRUE (1) или FALSE (0). expr REGEXP expr Проверяет строку на соответствие регулярному выражению expr. expr NOT REGEXP expr Проверяет строку на соответствие регулярному выражению expr.

select_expression может также содержать один или большее количество следующих математических функций.

ABS() Абсолютное значение (модуль числа).
CEILING() ()
EXP() Экспонента.
FORMAT(nr,NUM) Форматирует число в формат '#,###,###.##' с NUM десятичных цифр.
LOG() Логарифм.
LOG10() Логарифм по основанию 10.
MIN(),MAX() Минимум или максимум соответственно. Должна иметь при вызове два или более аргументов, иначе рассматривается как групповая функция.
MOD() Остаток от деления (аналог %).
POW() Степень.
ROUND() Округление до ближайшего целого числа.
RAND([integer_expr]) Случайное число типа float, 0 <= x <= 1.0, используется integer_expr как значение для запуска генератора.
SQRT() Квадратный корень.
<
select_expression может также содержать одну или больше следующих строковых функций.

CONCAT() Объединение строк.
INTERVAL(A,a,b,c,d) Возвращает 1, если A == a, 2, если A == b... Если совпадений нет, вернет 0. A,a,b,c,d... строки.
INSERT(org,strt,len,new) Заменяет подстроку org[strt...len(gth)] на new. Первая позиция строки=1.
LCASE(A) Приводит A к нижнему регистру.
LEFT() Возвращает строку символов, отсчитывая слева.
LENGTH() Длина строки.
LOCATE(A,B) Позиция подстроки B в строке A.
LOCATE(A,B,C) Позиция подстроки B в строке A, начиная с позиции C.
LTRIM(str) Удаляет все начальные пробелы из строки str.
REPLACE(A,B,C) Заменяет все подстроки B в строке A на подстроку C.
RIGHT() Get string counting from right.
RTRIM(str) Удаляет хвостовые пробелы из строки str.
STRCMP() Возвращает 0, если строки одинаковые.
SUBSTRING(A,B,C) Возвращает подстроку из A, с позиции B до позиции C.
UCASE(A) Переводит A в верхний регистр.
И наконец несколько просто полезных функций, которые тоже можно применить в select_expression.
CURDATE() Текущая дата.
DATABASE() Имя текущей базы данных из которой выполняется выбор.
FROM_DAYS() Меняет день на DATE.
NOW() Текущее время в форматах YYYYMMDDHHMMSS или "YYYY-MM-DD HH:MM:SS". Формат зависит от того в каком контексте используется NOW(): числовом или строковом.
PASSWORD() Шифрует строку.
PERIOD_ADD(P:N) Добавить N месяцев к периоду P (в формате YYMM).
PERIOD_DIFF(A,B) Возвращает месяцы между A и B. Обратите внимание, что PERIOD_DIFF работает только с датами в форме YYMM или YYYMM.
TO_DAYS() Меняет DATE (YYMMDD) на номер дня.
UNIX_TIMESTAMP([date]) Возвращает метку времени unix, если вызвана без date (секунды, начиная с GMT 1970.01.01 00:00:00). При вызове со столбцом TIMESTAMP вернет TIMESTAMP.
date может быть также строкой DATE, DATETIME или числом в формате YYMMDD (или YYYMMDD).

USER() Возвращает логин текущего пользователя. WEEKDAY() Возвращает день недели (0 = понедельник, 1 = вторник, ...).

Документация на MySQL


СИНТАКСИС:

GRANT (ALL PRIVILEGES | (SELECT, INSERT, UPDATE, DELETE, REFERENCES (column list), USAGE)) ON table TO user,... [WITH GRANT OPTION]

ОПИСАНИЕ:

Команда GRANT ничего не делает. Она всегда возвращает истину и нужна прежде всего, чтобы ввести в заблуждение некоторые прикладные программы, которые используют ODBC и думают, что команда GRANT, которую они выдали, что-то сделала. Вообще, ODBC такая библиотека, что для совместимости с ней предусмотрена не одна функция... См. главу для получения подробностей по поводу прав доступа в MySQL.



Групповые функции в операторе select:


Следующие функции могут быть использованы в предложении GROUP:

AVG() Среднее для группы GROUP.
SUM() Сумма элементов GROUP.
COUNT() Число элементов в GROUP.
MIN() Минимальный элемент в GROUP.
MAX() Максимальный элемент в GROUP.

Здесь MIN() и MAX() могут принимать строку или число в качестве аргумента. Эти функции не могут использоваться в выражении, хотя их параметр может быть выражением:

ПРИМЕР: "SUM(value/10)" нормально, но вот "SUM(value)/10" уже нет!

Строки автоматически конвертируются в числа и наоборот по мере необходимости (прямо как в perl). При использовании операторов = <> <= >= < > как в инструкции WHERE, левая сторона определяет, выполняется ли тест с числами или со строками. Все сравнения строк независимы от регистра (ISO8859-1).

ПРИМЕР:

"a" < "b" ; Сравнение строк "a" < 0 ; Сравнение строк 0 < "a" ; Сравнение чисел a < 5 ; Если поле имеет тип CHAR, то сравниваются строки, ; иначе сравниваются числа.

Если надо учитывать регистр, используйте REGEXP в HAVING. Имя столбца не должно иметь префикса таблицы, если данное имя столбца уникально. В LIKE выражения % и _ могут предваряться символом \ для получения символьного выражения. DATE является строкой с одним из синтаксисов:

YYMMDD (Год считается 2000, если YY < 70) YYYYMMDD YY.MM.DD Здесь '.' может быть любым нецифровым разделителем YYYY.MM.DD Здесь '.' может быть любым нецифровым разделителем

IFNULL() и IF() возвращает число или строку в зависимости от ситуации, в которой использованы. Order и group столбец может быть именем столбца, его псевдонимом или номером в операторе SELECT. HAVING может принимать в качестве аргумента любые поля или псевдонимы в select_expression. Он применяется последним перед передачей данных клиенту без какой-либо оптимизации. Не используйте его для элементов из предложения WHERE.

Замечание: Вы не можете написать:

SELECT user,MAX(salary) FROM users GROUP BY users HAVING max(salary)>10


Вместо этого, используйте нечто вроде следующего (это хороший пример использования ):

SELECT user,MAX(salary) AS sum FROM users GROUP BY users HAVING sum > 10

LIMIT принимает один или два аргумента. Один аргумент задает максимальное число строк в результате. В случае двух аргументов этот максимум задает второй аргумент, а первый указывает смещение первой строки. INTO OUTFILE 'filename' пишет результаты в файл. Файл не должен существовать на момент выполнения этой команды. См. раздел LOAD DATA INFILE для более подробной информации. Это может быть весьма опасной командой, если daemon запущен от имени root. Самое лучшее предоставить право доступа file только когда это абсолютно необходимо. Вы можете использовать числовое значение в предложении ORDER BY для определения столбца, который Вас интересует. ТО ЕСТЬ, если Вы желаете провести сортировку второго столбца, определенного в вашем запросе SELECT, следует написать "ORDER BY 2;". Это также полезно, когда Вы использовали функцию в вашем SELECT.

ПРИМЕР:

SELECT Widget_Table.widget_id, Widget_Table.widget_name, Purchase_Order_Item.widget_id, sum(Purchase_Order_Item.quantity) FROM Widget_Table, Purchase_Order_Item WHERE Widget_Table.widget_id = Purchase_Order_Item.widget_id GROUP BY Widget_Table.widge t_name ORDER BY 4;


Имена таблиц и столбцов


Вы можете использовать только набор символов ISO8859-2 (или набор символов который Вы определили при компиляции начальном выборе конфигурации и компиляции пакета), символ подчеркивания, и 0-9 в именах столбцов.

Дефисы, пробелы и другие специальные символы не могут использоваться, поскольку они сделали бы невозможным использование таблицы или столбца в операторе SELECT.



Indent


СИНТАКСИС:

static VOID Indent (indent) int indent;

ОПИСАНИЕ:

Выравнивает строку на заданный уровень indent. Отступ может быть задан во время компиляции пакета в виде количества символов на один уровень вложения.



InList


Проверите данную строку на членство в данном списке.

СИНТАКСИС:

static BOOLEAN InList (linkp, cp) struct link *linkp; char *cp;

ОПИСАНИЕ:

Проверяет строку, на которую указывает "cp" чтобы определить, находится ли эта строка в списке, на который указывает "linkp". Linkp указывает на первую строку в списке. Если linkp == NULL, то строка обрабатывается, как будто она находится в списке (все строки находятся в пустом списке). Это может казаться довольно странным сначала, но ведет к желательной операции, если никакой список не задан. Результатом является то, что все строки будут приняты, когда не имеется никакого списка, но когда имеется список, будут приняты только те строки, которые есть в списке.



INSERT INTO


СИНТАКСИС:

INSERT INTO table [(column_name, ...)] VALUES (expression,...) INSERT INTO table [(column_name, ...)] SELECT ...

ОПИСАНИЕ:

Вставляет данные в таблицу.

В выражении можно использовать любое предыдущее поле в списке column_name (или таблицу, если список имен столбцов не задан). При использовании SELECT вы не можете указать ORDER BY. Вы можете использовать функцию C API mysql_info для получения строки:

@result{Records: 220 Duplicates: 1 Warnings: 1}

Records показывает число записей, возвращенных SELECT'ом. Duplicates = число строк, которые не могли быть вставлены из-за дублирования ключей. Warnings = счетчик числа столбцов в запросе SELECT, которые равны NULL, но были объявлены как NOT NULL для таблицы, в которую Вы вставляете результаты. Столбцы получат значение по умолчанию (помните: в MySQL все NOT NULL столбцы имеют значение по умолчанию!). Если Вы не объявляли при создании таблицы это самое значение, оно будет автоматически назначено, основанным на типе поля. Если Вы желаете вставить NULL в данное значение, Вы должны сделать это, не определяя значение для поля, в которое Вы желаете вставить NULL.

ПРИМЕР:

INSERT INTO Customer(customer_name,customer_contact) VALUES("Joes Wholesale","Joe Smith")

Этот запрос создаст новую запись в таблице Customer, которая будет содержать автоматически сгенерированный customer_id, и значения, определенные в запросе. Все другие поля будут пустыми (NULL).

Вы также можете использовать SELECT для копирования элементов из одной таблицы в другую. MySQL поддерживает ограниченную форму запросов sub, для выполнения этой возможности.

Вы должны иметь права доступа insert для использования этой команды.



Интерфейс с языками программирования


Наиболее простой способ работы с MySQL сводится к использованию программы MySQL. Это клиентская часть СУБД MySQL. Можно выполнять команды SQL непосредственно из командной строки системы unix или из интерактивного режима MySQL. Подробнее о клиентских программах.

СУБД MySQL имеет библиотеку C API. Ее можно использовать для запросов к базе данных, вставки данных, создания таблиц и т.п. C API поддерживает все функции MySQL. Подробности в главе .

Язык perl поддерживается сразу двумя способами:

Портирован интерфейс с perl из mini-SQL, разработанный Андреасом Коенигом (Andreas Koenig ). Есть модуль perl DBD

Подробнее этот вопрос рассмотрен в главе .

Также доступен 32-битный ODBC драйвер для MySQL. Он позволяет запрашивать и получать данные из других источников с поддержкой ODBC. С подробностями можно ознакомиться на домашней страничке MySQL (увы, только на английском языке).

|