SQL СУБД (реляционная) без излишеств (правда, в последней версии появились транзакции с помощью Berkley DB и INNOBASE), зато быстрая (для поиска и добавления, если предстоят частые изменения, то лучше поискать другую СУБД). Стандарты: entry level SQL92, ODBC levels 0-2.
Лицензия - GPL/LGPL (но в случае извлечения прибыли от MySQL фирма - MySQL AB, Швеция - мягко намекает на оплату поддержки). Для хостинга лицензия не нужна, но клиенты должны иметь возможность убедиться, что все установлено правильно (предлагается давать доступ на чтение к установленным исходникам).
Написана на C и C++. Базовая платформа: Solaris 2.7-2.8, SuSE Linux 7.1 (ядро 2.4, ReiserFS), но работает также в AIX, BSDI, DEC Unix, FreeBSD, HP-UX, Linux 2.0, Mac OS X, NetBSD, OpenBSD, OS/2, SGI Irix, SunOS, SCO OpenServer, SCO UnixWare, Tru64, Win9x, NT, Win2000.
Многопотоковая. Первоначально мимикрировала под mSQL. API для C, C++, Java, Eiffel, Perl, PHP, Python, Tcl. ODBC. Парольная защита (пароли шифруются перед пересылке, это, однако, не увеличивает безопасность).
Таблицы в виде B-tree со сжатием индекса. До 32 индексов на таблицу. До 16 колонок на индекс. Длина индекса до 500 байт. Таблицы в памяти. Записи переменной длины. Есть примеры использования MySQL с 60000 таблиц и 5 миллиардами строк. Отсутствует memory leak (проверено Purify). Поддержка koi8-r и cp1251 (сортировка, сравнение и т.д.). Клиенты могут соединяться по TCP/IP (можно использовать только, если никто не подслушивает) или Unix socket. Можно встраивать в свои программы.
Стабильность подсистем: ISAM - стабильная, MyISAM - gamma, C API - стабильная (буфер до 16МБ), mysql(admin,show,dump,import) - стабильные, Basic SQL - стабильная, оптимизатор - стабильная, блокировка (одновременный доступ нескольких процессов, не клиентов) - gamma (проблемы в Linux, рекомендуется --skip-locking), нити в Linux - рекомендуется --skip-locking и использовать не более 1000 одновременных соединений, DBD - стабильная, MyODBC - gamma, репликация - бета/gamma, BDB - бета (транзакции), автоматическое восстановление MyISAM - бета, слияние таблиц - бета/gamma, INNODB - альфа (транзакции с блокировкой на уровне строк), полнотекстовый поиск - бета.
Расширения к ANSI SQL92:
типы полей MEDIUMINT, SET, ENUM и различные модификации BLOB и TEXT
атрибуты полей: AUTO_INCREMENT, BINARY, NULL, UNSIGNED и ZEROFILL
по умолчанию строки сравниваются независимо от регистра
ключевые слова TEMPORARY и IF NOT EXISTS при создании/удалении таблиц
ключ DELAYED при создании/замене строк
ключ LOW_PRIORITY при манипуляции со строками
SHOW
строки можно заключать не только в апострофы, но и в кавычки
если upgrade, то остановить mysql, сохранить базы данных и my.cfg (не забыть потом удалить!)
make install (как root)(16 MB, из них 5МБ - тест)
/usr/local/mysql/include/mysql
/usr/local/mysql/info
/usr/local/mysql/man
/usr/local/mysql/lib/mysql (libdbug, libheap, libmerge, libmyisam, libmyisammrg, libmysqlclient, libmystrings, libmysys, libnisam); эту директорию указывать для libtool, либо занести в /etc/ld.so.conf
/usr/local/mysql/data (базы данных, конфигурация, журналы, pid-файл)
при первой установке: scripts/mysql_install_db (как root - создание таблиц с правами доступа, дает все права пользователю root без пароля и позволяет делать все с базами test и test_*, кроме раздачи привилегий)
chown -R root:mysql /usr/local/mysql (как root)
chown -R mysql /usr/local/mysql/data (и отдельную директорию для mysql.sockets с правами чтения для всех; mysql не нужны права на запись для my.cnf)
support-files/mysql.server в /etc/rc.d/init.d для автоматического запуска и дать ему права на исполнение и сделать линк K00mysql из rc0.d и rc6.d на него, S99mysql из rc2.d, rc3.d и rc5.d на него
скопировать my-medium.cnf в /usr/local/mysql/data/my.cnf и слегка отредактировать [mysqld]
socket=имя-файла под Unix-socket (и в раздел [client] тоже)
skip-locking (не блокировать доступ к данным от ДРУГИХ процессов)
log-bin #журнал изменений для репликации
log-slow-queries
log-update #журнал изменений
#secure - говорит, что нет такой опции
skip-networking #если не нужен доступ по TCP/IP (а еще лучше использовать ssh + port forward)
safe-show-database
skip-show-database
server-id=1 # что это?
куча set-variable из исходного файла
set-variable = max_connections=500
тестовый запуск: /usr/local/mysql/bin/safe_mysqld --user=mysql (как root)(или сразу /etc/rc.d/rc3.d/S99mysql start)
Скрипт предназначен для /etc/rc.d/init.d (и линки в 0,2,3,5,6 не забыть). Соответственно первый параметр start или stop (посылается сигнал процессу, вместо выполнения "mysqladmin shutdown"). Далее обработка опций из конфигурационного файла (группы [mysqld] и [mysql_server]) и командной строки (какая командная строка в скрипте из rc.d?!). Ищет и запускает safe_mysqld. Если нужны какие-либо специфические опции safe_mysqld, то их можно указать здесь. Секция [mysql.server] в конфигурационном файле /etc/my.cnf может содержать установку переменных:
Скрипт запускает mysqld и перезапускает его ежели тот помрет. Проверяет, что не был запущен ранее. Грохает зависшие процессы. Запускать под root. Пытается определить где что лежит (понимает только стандартные конфигурации, иначе надо запускать из BASEDIR). Собирает опции из секций mysqld, server и safe_mysqld конфигурацинных файлов и командной строки (м.б. модифицированных опциями --no-defaults, --defaults-file=имя и --defaults-extra-file=имя). Передает их ("улучшив" некоторые из них) mysqld. Свои опции:
--enable-locking (внешняя блокировка - если нужна блокировка нескольких серверов или myisamchk к одной базе данных; работает неустойчиво и медленно)
--flush (сбрасывать буфера на диск после каждой SQL-команды
--help (выдает список команд; настройки, выбранные при сборке с учетом текущих параметров и значения переменных)
--init-file=имя-файла (при запуске читать команды из файла)
--language (язык сообщений об ошибках)
--log[=имя-файла] (записывать все соединения и команды в журнал)
--log-bin[=имя-файла] (записывать журнал в новом двоичном формате для репликации)
--log-bin-index=имя-файла (хранит имена последних бинарных журналов)
--log-slow-queries[=имя-файла] (записывать все слишком медленные - занимающие более long_query_time секунд - команды в журнал)
--log-update[=имя-файла] (записывать изменения в журнал)
--log-long-format (дополнительную информацию в журнал изменений)
--low-priority-updates (INSERT/DELETE/UPDATE будут иметь меньший приоритет, чем SELECT)
--memlock (не свопировать mysqld)
--myisam-recover[=опция...] (проверка корректности myisam таблиц и способ восстановления):
DEFAULT
BACKUP (делать резервную копию при исправлениях - .BAK)
FORCE (исправлять даже если это приведет к потере многих данных)
QUICK
--new (использовать новые, т.е. недоотлаженные возможности)
--no-defaults
--port=TCP-порт
-O имя=значение (установить переменную, список по --help)
--safe-mode (уменьшить уровень оптимизации)
--safe-show-database (не показывать имена БД пользователям, которые не имеют к ним никаких прав)(или нет такой опции? в списке ее нет, но не ругается)
--secure (двойная проверка IP-адресов - есть ли такая опция? если ее указать, то не стартует. Или она теперь по умолчанию? Если нет, то именами хостов вообще нельзя пользоваться!)
--skip-bdb
--skip-delay-key-write (отключить буферизацию записи ключей)
--skip-grant-tables (отключить проверку прав доступа)
--skip-locking (не использовать внешнюю блокировку; safe_mysqld использует этот ключ; ключ применяется, если не нужна блокировка нескольких серверов или myisamchk к одной базе данных; все равно внешняя блокировка работает неустойчиво и медленно; команда LOCK работает даже с этим ключом)
--skip-name-resolve (в таблицах прав доступа д.б. только IP)
--skip-networking (не слушать TCP/IP, только через unix socket)
--skip-new (не использовать новые, т.е. не доотлаженные возможности)
--skip-show-database (не позволять команду SHOW DATABASE, если пользователь не имеет привилегии работы с процессами. В другом месте говорится, что вообще ничего не показывать - но это неправда)
--skip-thread-priority (ускоряет ответ)
--socket=путь
--tmpdir=путь (вместо /tmp)
--user=имя-пользователя (обязательно, если запускается из под root)
Опции берутся в следующем порядке (последующие затирают предыдущие):
переменные окружения
/etc/my.cnf
/usr/local/mysql/data/my.cnf (нельзя поменять с помощью --datadir)
из файла, указанного ключом --defaults-extra-file
~/.my.cnf
опции в командной строке
Действуют на mysql, mysqld, mysqladmin, mysqlimport, mysqldump, myisamchk, myisampack, mysql.server. Файл делится на секции. Секция начинается со строки, в которой указано имя секции в квадратных скобках. Имя секции соответствует имени программы на которую она действует. Любая длинная опция программы (начинающаяся с двух минусов, запустите программу с ключом --help) может быть использована здесь (минусы надо отбросить). Секция с именем client позволяет задать опции (например, пароль ;), общие для всех клиентских программ. Переменные устанавливаются строкой: set-variable = имя=значение.
MySQL позволяет использовать для хранения данных различные типы таблиц (методы доступа). Меняется командой ALTER TABLE, описание хранится в файле .frm.
MyISAM (по умолчанию, см. --default-table-type). Индекс - .MYI, данные - .MYD. Восстановление - myisamchk. Бывают таблицы с записями фиксированной длины, переменной длины (BLOB, VARCHAR, TEXT) и сжатые (myisampack - только чтение). Машинонезависимый формат хранения (хотя формат плавающей точки должен совпадать на этих архитектурах).
MERGE - виртуальное слияние таблиц одинакового формата (SELECT, UPDATE и DELETE). Список в файле .MRG.
ISAM. Предлагается больше не использовать. Индекс - .ISI, данные - .ISD. Индексирование - B-tree. Восстановление - isamchk. Зависит не только от архитектуры, но и от ОС.
HEAP - таблицы в памяти с хешированием. Записи только фиксированной длины.
BDB (с поддержкой транзакций). Надежнее (автоматическое восстановление). Транзакции (BEGIN/COMMIT/ROLLBACK). Дольше, больше места на диске и в памяти.
Аутентификация пользователя производится по имени (до 16 символов), паролю (м.б. пустым) и хосту или его IP. Большинство клиентских программ по умолчанию используют mysql-имя, совпадающее с unix-именем, но это можно изменить с помощью ключа --user=. Пароль можно задать:
прямо в командной строке после ключа -p (без пробела, очень опасно)
указав ключ -p без пароля (программа запросит пароль с клавиатуры, наиболее безопасно)
в файле .my.cnf (права к этому файлу должны быть только у собственника), секция [client], поля host, user и password
с помощью переменной окружения MYSQL_PWD (очень опасно) и MYSQL_HOST
Вся информация о правах хранится в БД с именем mysql. Никто не должен иметь к ней доступа на чтение (см. про пароли).
Используются таблицы:
user (используется чтобы понять - пускать/не пускать; данные здесь права действуют на все БД; административные привилегии и операции с файлами определяются только здесь)
Host: CHAR(60),PRI, нечувствителен к регистру. Может содержать имя хоста, IP адрес или localhost. Можно использовать шаблоны с символами '%' (любое количество любых символов) и '_' (любой символ). Пустое поле означает, что производится логическое "И" привилегий в данной строке и привилегий в соответствующей строке таблицы host. При использовании IP-адреса можно задавать сетевую маску (в виде - /255.255.255.0 или /24).
User: CHAR(16),PRI. Пустое поле соответствует любому имени, в данном случае пользователь рассматривается как анонимный и предоставленное им имя заменяется на пустое для дальнейших проверок прав доступа.
Password: CHAR(16), зашифрован, но не так как в Unix, знание даже зашифрованного пароля позволяет выдать себя за данного пользователя - пароль шифруется на стороне клиента! Может быть пустым - пользователь также должен предъявить пустой пароль.
привилегии: enum('N','Y'), по умолчанию - 'N'
select - выборка из строк таблицы
insert - вставка строки в таблицу
update - изменение строки таблицы
delete - удаление строки таблицы
create - создавать БД/таблицу
drop - удалять БД/таблицу
reload - позволяет выполнять административные команды (reload, refresh, flush-*)
shutdown - позволяет остановить mysqld
process - позволяет выполнить processlist (можно смотреть текст команд, выполняемых другими пользователями (в т.ч. SET PASSWORD)), kill
file - читать файлы (LOAD DATA INFILE) и писать файлы (SELECT ... INTO OUTFILE), с точки зрения Unix используются права, с которыми запущен mysqld (в частности, он может прочитать /etc/passwd, любую БД и т.п., записать файл в /tmp и т.п., но не может переписать уже существующий файл)
grant - передавать свои привилегии другим, два пользователя с различными привилегиями могут объединить их ;)
references - не реализовано
index - создавать/удалять индексы таблицы
alter - изменять формат таблицы, в том числе переименовать ее, что позволяет обмануть систему прав доступа
host
Host: CHAR(60),PRI. '%' или пустое поле означает - любой хост.
DB: CHAR(64),PRI. '%' или пустое поле означает - любая БД.
привилегии: enum('N','Y'), по умолчанию - 'N'
select
insert
update
delete
create
drop
grant
references
index
alter
db
Host: CHAR(60),PRI. Строка '%' означает - при доступе с любого хоста. Пустое поле означает необходимость посмотреть в таблицу host.
DB: CHAR(64),PRI. '%' или пустое поле означает - любая БД.
User: CHAR(16),PRI. Пустое поле - анонимный пользователь.
привилегии: enum('N','Y'), по умолчанию - 'N'
select
insert
update
delete
create
drop
grant
references
index
alter
tables_priv
Host: CHAR(60),PRI. '%' или пустое поле означает - любой хост.
DB: CHAR(60),PRI. Не м.б. пустым или содержать шаблоны.
User: CHAR(16),PRI. Пустое поле - анонимный пользователь.
Table_name: CHAR(60)(или 64?),PRI. Не м.б. пустым или содержать шаблоны.
Проверка права на подсоединение к серверу: mysql-клиент предъявляет имя пользователя, сервер определяет имя (или IP) хоста клиента (или localhost для обращения через unix-socket). По данной паре (адрес/имя) ищется строка в таблице user. Предварительно таблица сортируется по полям (Host/User) так, что наиболее специфичные строки оказываются первыми, наименее специфичные - последними. Если строка не найдена, то соединение отвергается. Если - найдена, то сверяется пароль.
Проверка прав при исполнении каждого запроса: таблица db сортируется по полям Host, Db и User, таблица host по полям Host и Db, таблицы tables_priv и columns_priv по полям Host, Db и User от наиболее специфичного к наименее. Для административных запросов и доступа к файлам проверяется только таблица user. Для прочих запросов в начале проверяется таблица user - а нет ли у данного пользователя прав доступа на "глобальном" уровне. Если есть - операция разрешается. Если нет, то проверяются права доступа к конкретной БД с конкретного хоста (по пересечению таблиц Db и Host с учетом шаблонов и пустых полей). Если их достаточно, то доступ дается. Если недостаточно, то к объединению "глобальных" прав и прав БД/хост добавляются права, извлеченные из таблиц tables_priv и columns_priv. Если и этого не хватает, то увы...
Права доступа читаются mysqld (и не читаются при "ручном" изменении БД mysql):
при запуске
при выполнении команд GRANT, REVOKE и SET PASSWORD
при выполнении команды FLUSH PRIVILEGES
при выполнении mysqladmin flush-privileges/reload
"Глобальные" привилегии и изменения пароля вступают в силу только при следующем соединении. Изменения в доступе к БД - при следующей команде use. Изменения в доступе к таблицам и колонкам - при следующем запросе.
Все команды, введенные в клиенте mysql (а в других?) попадают в .mysql_history (того unix-пользователя, который запускал mysql). А также в различные журналы сервера и в выдачу команды SHOW PROCESSLIST.
Изменение пароля: set password for имя=password('новый пароль').
GRANT тип-привилегии [(список-столбцов)] [, тип-привилегии [(список-столбцов)] ...] ON { имя-таблицы | * | *.* | имя-БД.* } TO имя-пользователя [ IDENTIFIED BY 'пароль' ] [, имя-пользователя [ IDENTIFIED BY 'пароль ] ... ] WITH GRANT OPTION
Для столбцов можно задавать только INSERT, SELECT и UPDATE. Для таблиц - INSERT, SELECT, UPDATE, CREATE, DROP, DELETE, GRANT, INDEX, ALTER. Использование "*.*" означает задание глобальных привилегий. Использование "*" означает задание привилегий для текущей БД (если текущей БД нет, то глобальные).
SHOW GRANTS FOR имя@хост;
Если привилегии на уровне таблиц и колонок используются хотя бы для одного пользователя, то проверки делаются для всех запросов всех пользователей, что очень сильно замедляет работу.
Для упрощения жизни можно использовать утилиты mysqladmin и mysqlaccess, xmysqladmin, mysql_webadmin из директории Contrib.
Посмотрев на это безобразие, ORACLE может перестать волноваться ;) Зря они различают пользователей с одним именем, пришедших с разных хостов (наверное, когда-то mysql-имя совпадало с unix-именем и этой информации м.б. доверять :). Не говоря об отсутствии шифровки при передаче данных по сети и возможность подсовывать перехваченный зашифрованный пароль
Не храните пароли и тому подобную информацию в БД в открытом виде.
строка (в апострофах или кавычках, обратная косая черта как escape-символ)
целое число (64 бита)
вещественное число
шестнадцатеричное число: в численном контексте как целое (64-бит), в строковом контексте пара 16-ричных цифр преобрацуется в символ
NULL (N при экспорте/импорте)
Имена
БД (имя файла до 64 символов, кроме '/' и точки, в некоторых случаях до 60 символов)
таблица (имя файла до 64 символов, кроме '/' и '.')
колонка (до 64 любых символов). Можно ссылаться:
col_name
tbl_name.col_name
db_name.tbl_name.col_name
алиас (до 255 любых символов)
Если в имени есть спецсимволы или оно совпадает с зарегистрированным словом, то его надо заключать в апострофы. Нельзя использовать символы 0x00 или 0xFF (привет маленькому "я" в cp1251!), апостроф и кавычку. Имена БД и таблиц чувствительны к регистру в Unix и нечувствительны в MS Windows. Имена колонок нечувствительны везде. Алиасы на таблицы чувствительны везде, алиасы на колонки нечувствительны везде.
Переменные
Имя переменной начинается с '@', может содержать буквы, цифры, '_', '$', '.'. Первоначальное значение - NULL. Может содержать целое (64 бита), вещественное или строку. Можно использовать в тех местах, где разрешается использование выражений (не числовых констант как во фразе LIMIT!). Действует на текущую нить (thread). Установка:
SET @имя=выражение
@имя:=выражение внутри выражения
Комментарии
как в C (начиная с '/*' до '*/'); если после '/*' стоит восклицательный знак и номер версии, то содержимое комментария исполняется, если номер версии равен или больше указанного
как в sh (начиная с '#' до конца строки)
как в SQL :) (начиная с '-- ' до конца строки, не забудьте про пробел!)
M - ширина поля при отображении (максимально - 255). D - число знаков в дробной части (не более M-2 и 30).
Числовые (если число занимает меньше M позиций, то оно дополняется слева пробелами или нулями для ZEROFILL. Если число занимает более M колонок, то выводятся все цифры. Если используется ZEROFILL для целых, то автоматически добавляется UNSIGNED). Все вычисления проводятся с точностью 63 бита или переводом в DOUBLE (кроме нескольких функций).
Дата и время (проверка значений не очень тщательная, например, дата 1999-11-31 будет воспринята нормально; допусимы номер дня, равный нулю, и номера месяца И дня равные нулю; неверное значение преобразуется в "нулевое" - 0000-00-00 и т.д.; заносить можно как строки с разделителями полей - любыми -, так и без разделителей или числа)
DATE (дата от '1000-01-01' до '9999-12-31'; 3 байта)
DATETIME (время от '1000-01-01 00:00:00' до '9999-12-31 23:59:59'; 8 байт)
TIMESTAMP[(M)] (время от 19700101000000 до 2037 года; 4 байта; если при INSERT или UPDATE (должны быть реальные изменения) значение опущено (только первая колонка этого типа) или равно NULL или NOW(), то заносится текущее время; формат выдачи зависит от M (хранится всегда все; задавать надо тоже все):
14 (по умолчанию) - YYYYMMDDHHMMSS
12 - YYMMDDHHMMSS
8 - YYYYMMDD
6 - YYMMDD
TIME (время от -838:59:59 до 838:59:59; выводится как HH:MM:SS; 3 байта; можно вводить как 'D HH:MM:SS.fraction', хотя доли пока не хранятся)
YEAR[(2|_4_)] (от 1901 до 2155 или от 1970 до 2069; 1 байт)
Строки (в MySQL CHAR всегда NATIONAL; надо учитывать, что максимальная длина строки таблицы и пакета протокола клиент/сервер - 16 МБ - и надо увеличить размер каких-то буферов как сервера, так и клиента; VARCHAR, BLOB и TEXT - строки переменной длины; BINARY - навязчивый атрибут, т.е. если операнд выражения - BINARY, то все выражение - BINARY; TEXT - это BLOB, который сортируется и сравнивается в нечувствительной к регистру манере; TEXT можно рассматривать как VARCHAR нужного размера, а BLOB можно рассматривать как VARCHAR BINARY нужного размера, но хвостовые пробелы не удаляются и не м.б. значения по умолчанию; для CHAR и VARCHAR можно индексировать префикс колонки; для BLOB и TEXT обязательно индексировать префикс фиксированной длины; для VARCHAR и TEXT можно создавать индекс специального вида FULLTEXT для индексирования всей колонки; ORDER BY и GROUP BY работают только с объектами фиксированной длины или первыми max_sort_length байтами)
[NATIONAL] CHAR(M) [BINARY] (фиксированной длины от 1 до 255; дополняется справа пробелами; при извлечении правые пробелы удаляются; сортируются и сравниваются нечувствительно к регистру относительно набора символов по умолчанию, если не указано BINARY; CHAR(0) занимает 1 бит и может принимать два значения - NULL и "")
NCHAR - синоним NATIONAL CHAR
CHARACTER - синоним CHAR
[NATIONAL] VARCHAR(M) [BINARY] (строка переменной длины от 1 до 255; правые пробелы удаляются при сохранении; сортируются и сравниваются нечувствительно к регистру относительно набора символов по умолчанию, если не указано BINARY)
CHARACTER VARYING - синоним VARCHAR
TINYBLOB (BLOB макс. длины 255)
TINYTEXT (TEXT макс. длины 255)
BLOB (BLOB макс. длины 65535)
TEXT (TEXT макс. длины 65535)
MEDIUMBLOB (BLOB макс. длины 2^24-1)
MEDIUMTEXT (TEXT макс. длины 2^24-1)
LONGBLOB (BLOB макс. длины 2^32-1, в действительности строка таблицы ограничена 16МБ)
LONGTEXT (TEXT макс. длины 2^32-1)
ENUM('строка1','строка2',...) (может принимать значение из списка, NULL или "" - как признак ошибки при вставке; не более 65535 различных значений; 1 или 2 байта; если описан как NULL, то по умолчанию вставляется NULL; если описан как NOT NULL, то по умолчанию вставляется первая строка из списка; каждая строка имеет индекс, начиная с 1; индекс "" равен 0; индекс NULL равен NULL; в числовом контексте извлекается индекс, а не строка (как при вставке, так и при извлечении); сортировка производится по индексу; регистр букв не влияет при вставке, но извлекается в том виде, в каком колонка описывалась)
SET('строка1','строка2',...) (может одновременно принимать от 0 до 64 значений из списка; элемент списка не может содержать запятую; 1, 2, 3, 4 или 8 байт;если значение SET извлекается/устанавливается в числовом контексте, то в числе каждому установленому биту соответствует элемент множества (первый элемент в описании множества соответствует младшему биту); сортируются как числа)
имя-колонки тип [NOT NULL | NULL] [DEFAULT значение-по-умолчанию] [AUTO_INCREMENT] [PRIMARY KEY] [описание-ссылки] NULL: по умолчанию AUTO_INCREMENT: для колонки типа целое число, при вставке NULL или 0 в такую колонку ищется максимальное значение колонки и увеличивается на единицу; отсчет начинается с 1; при удалении строки с наибольшим значением бывает всякое ;); такая колонка м.б. только одна и она д.б. проиндексирована; не надо записывать в такую колонку отрицательных чисел; получить наибольшее число можно с помощью оператора: SELECT * FROM имя-таблицы WHERE имя-колонки IS NULL DEFAULT: назначается системой (NULL, 0, пустая строка и т.д.), если Вы не установили явно SELECT позволяет создать новую таблицу на основе уже существующей
PRIMARY KEY (имя-колонки[(длина)],...) уникальный ключ; все ключевые колонки д.б. NOT NULL; только один на таблицу (присваивается имя PRIMARY)
[CONSTRAINT символ] FOREIGN KEY имя-индекса (имя-колонки[(длина)],...) [описание-ссылки] не реализовано
CHECK (выражение) не реализовано
описание-ссылки ::= REFERENCES имя-таблицы [(имя-колонки[(длина)],...)] [MATCH FULL | MATCH PARTIAL] [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}] [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}] не реализовано
RAID_TYPE= {1 | STRIPED | RAID0 } RAID_CHUNKS=число-расслоений RAID_CHUNKSIZE=числоKB требуется ключ --with-raid при сборке; пока реализован только тип STRIPED (1 и RAID0 - это синонимы для STRIPED); позволяет создавать таблицы с данными более 2GB (или распараллелить ввод/вывод, если разнести директории на разные диски)
UNION = (имя-таблицы,[имя-таблицы...]) только для таблиц типа MERGE
ALTER [IGNORE] TABLE имя-таблицы как-менять [,как-менять ...]
ADD [COLUMN] описание-колонки [FIRST | AFTER имя-колонки ] без FIRST или AFTER колонка вставляется в конец
делается временная копия таблицы, изменяется, затем старая таблица удаляется (соответственно, нужны привилегии: select, insert, delete, update, create и drop) IGNORE: если в преобразованной таблице образуются одинаковые значения UNIQUE индексов, то берется только одна строка (без IGNORE операция откатывается) нельзя сделать размер колонки короче, чем используется в каком-либо индексе
RENAME TABLE tbl_name TO new_table_name[, tbl_name2 TO new_table_name2,...] оператор выполняется как единое целое, что позволяет подменить таблицу пустой:
CREATE TABLE new_table (...); RENAME TABLE old_table TO backup_table, new_table TO old_table;
DROP TABLE [IF EXISTS] имя-таблицы [, имя-таблицы,...] [RESTRICT | CASCADE] RESTRICT и CASCADE не реализованы
обслуживание таблиц
OPTIMIZE TABLE имя-таблицы [, имя-таблицы,...] полезно после больших удалений или изменений таблиц с переменной длиной строки: сортировка индексов и дефрагментация
CHECK TABLE имя-таблицы [, имя-таблицы,...] {QUICK | FAST | MEDIUM | EXTEND | CHANGED}
BACKUP TABLE имя-таблицы [, имя-таблицы,...] TO 'имя-директории'
RESTORE TABLE имя-таблицы [, имя-таблицы,...] FROM 'имя-директории'
DELETE [LOW_PRIORITY] FROM имя-таблицы [WHERE выражение] [LIMIT макс-число-строк] место не освобождается - используйте OPTIMIZE
TRUNCATE TABLE имя-таблицы удаляет таблицу и тут же создает заново
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [HIGH_PRIORITY] [DISTINCT | DISTINCTROW | ALL] выражение [AS имя-алиаса],... [INTO {OUTFILE | DUMPFILE} 'имя-файла' опции-экспорта [FROM из-каких-таблиц [WHERE выражение] [GROUP BY {номер-колонки | имя-колонки | формула} [ASC | DESC], ...] [HAVING выражение] [ORDER BY {номер-колонки | имя-колонки | формула} [ASC | DESC], ...] [LIMIT [смещение-от-0,] макс-число-строк] [PROCEDURE имя-процедуры] [FOR UPDATE | LOCK IN SHARE MODE]] FROM - простейший случай синтаксиса - имя-таблицы, если таблиц несколько, то смотри синтаксис JOIN (в простейшем случае имена перечисляются через запятую); также можно задавать алиас таблицы с помощью слова AS HAVING применяется последним (в частности, после GROUP BY) непосредственно перед посылкой результата клиенту (т.е. без оптимизации!) DUMPFILE: в файл записывается одна строка безо всяких разделителей полей и строк и escape (позволяет, например, сбросить картинку из BLOB) OUTFILE и DUMPFILE: необходимо иметь привилегии file, если файл с указанным именем существовал, то он не затирается; права к файлу устанавливаются на чтение для всех FOR UPDATE: если тип таблицы позволяет блокировку страницы/строки (InnoDB, GEMINI), то задействованные строки блокируются на запись
Между именем функции и скобкой не должно быть пробела. Операндами могут быть константы, имена колонок и переменные.
группировка функций с помощью круглых скобок
арифметические операции: +, -, *, /
битовые функции: |, &, <<, >>, ~, BIT_COUNT()
логические функции: !, ||, && (возвращают 1, 0, или NULL)
сравнение:
=, <>, !=, <=, <, >=, >
<=> (сравнение, позволяющее сравнивать NULL)
expr IS NULL, expr IS NOT NULL
expr BETWEEN min AND max
expr IN (значение1,...)
expr NOT IN (значение1,...)
ISNULL()
COALESCE(список) - возвращает первый ненулевой элемент списка
INTERVAL(N,N1,N2,N3,...) - возвращает номер интервала, т.е. 1, если N < N1; 2 если N < N2 и т.д.
сравнение строк (если выражение чувствительно к регистру, то и сравнение будет чувствительным к регистру)
expr LIKE шаблон [ESCAPE 'escape-символ'] (соответствие простому регулярному выражению SQL; "%" - любое количество любых символов; "_" - ровно один символ; escape-символ по умолчанию - ""; чтобы найти ' ' надо задать в шаблоне ' '; чтобы найти '' - '\')