Изменяет или опрашивает библиотеку
PRAGMA имя [= значение] | функция( аргумент )
Команда PRAGMA управляет выполнением процесса QDB или запрашивает у библиотеки внутренние (нетабличные) данные. Команда PRAGMA имеет такой же интерфейс, как другие команды (например, SELECT или INSERT), однако отличается от них несколькими важными аспектами:
Команды PRAGMA, которые принимают целочисленный аргумент, также принимают символьные имена. Строки on, true и yes эквивалентны значению 1
, а строки off, false и no — значению 0
. Они не чувствительны к регистру и их не нужно заключать в кавычки. Нераспознанная строка считается равной 1
и не вызывает ошибку. Возвращаемое значение является целым числом.
Команды PRAGMA делятся на четыре основных категории:
Автоматическая очистка базы данных
PRAGMA auto_vacuum;PRAGMA auto_vacuum = 0 | 1;
Задает или запрашивает значение флага auto_vacuum базы данных.
Обычно при удалении данных размер файла базы данных не изменяется. Неиспользуемые страницы файла отмечаются соответствующим образом и могут повторно использоваться при вставке данных в базу. Чтобы освободить неиспользуемую память в этом режиме, необходимо выполнить команду VACUUM или вызвать функцию qdb_vacuum().
Если флаг auto_vacuum установлен, размер файла базы данных уменьшается при фиксации транзакции, которая удаляет данные (в этом режиме нет смысла вызывать команду VACUUM). Для поддержки этой функции в базе данных хранится дополнительная информация, которая незначительно увеличивает ее размер.
Можно устанавливать и снимать флаг auto_vacuum только до создания таблиц в базе данных. При попытке изменить состояние флага после создания таблиц сообщение об ошибке не генерируется.
По умолчанию режим автоматической очистки отключен. Частая очистка может занимать много времени, если накопитель (например, с флеш-памятью NOR) медленно выполняет операции записи. Если база данных хранится на таком накопителе, рекомендуется вызывать функцию qdb_vacuum() или команду SQL: VACUUM, а не использовать режим автоматической очистки.
Размер кэша
PRAGMA cache_size;PRAGMA cache_size = количество_страниц;
Запрашивает или задает максимальное количество дисковых страниц базы данных, которые QDB хранит в памяти одновременно. Каждая страница занимает около 1,5 Кбайт памяти. По умолчанию объем кеша составляет 2000 страниц. Если операции UPDATE или DELETE изменяют большое количество строк базы данных, можно ускорять их выполнение, увеличивая объем кеша QDB (если это целесообразно).
Изменение размера кеша командой cache_size действует только в рамках текущего сеанса. После закрытия и повторного открытия базы данных размер кеша принимает значение по умолчанию. Чтобы изменить размер кеша по умолчанию, следует воспользоваться командой default_cache_size.
Чувствительность к регистру
PRAGMA case_sensitive_like;PRAGMA case_sensitive_like = 0 | 1;
По умолчанию оператор LIKE игнорирует регистр символов Latin1; следовательно выражение "'a' LIKE 'A'" равно true. Для изменения этого режима можно воспользоваться режимом case_sensitive_like. Когда он активен, выражение "'a' LIKE 'A'" равно false, но выражение "'a' LIKE 'a'" по-прежнему равно true.
Подсчет изменений
PRAGMA count_changes;PRAGMA count_changes = 0 | 1;
Запрашивает или изменяет состояние флага count_changes. Если этот флаг не установлен, операторы INSERT, UPDATE и DELETE не возвращают данные. Если флаг count_changes установлен, указанные команды возвращают строку данных с единственным целочисленным значением — количеством вставленных, обновленных или удаленных строк соответственно. В возвращаемом значении не учитываются операции вставки, обновления и удаления, которые выполняются триггерами.
Размер кэша по умолчанию
PRAGMA default_cache_size;PRAGMA default_cache_size = количество_страниц;
Запрашивает или задает максимальное количество дисковых страниц базы данных, которые QDB хранит в памяти одновременно. Каждая страница занимает 1 Кбайт на диске и около 1,5 Кбайт в оперативной памяти. Эта команда действует аналогично команде cache_size, но изменяет размер кеша по умолчанию. После повторного открытия базы данных кеш имеет размер, который задан с помощью этой команды.
Полные имена столбцов
PRAGMA full_column_names;PRAGMA full_column_names = 0 | 1;
Запрашивает или изменяет состояние флага full_column_names. Этот флаг определяет принцип присвоения имен столбцам данных, возвращаемых операторами SELECT, в которых столбцы заданы с помощью имени или шаблона "*". Обычно используются два формата имен столбцов результатов: имя_таблицы | псевдоним имя_столбца, если оператор SELECT объединяет две или более таблиц, либо имя_столбца, если оператор SELECT содержит запрос к единственной таблице. Если флаг full_column_names установлен, столбцам всегда присваиваются имена в первом формате независимо от того, выполняется ли объединение.
Если установлены оба флага short_column_names и full_column_names, флаг full_column_names имеет приоритет.
Устаревший формат файла
PRAGMA legacy_file_format;PRAGMA legacy_file_format = ON | OFF
Эта команда задает или запрашивает состояние флага legacy_file_format. Если этот флаг установлен, новые базы данных sqlite создаются в формате, который позволяет выполнять чтение и запись с помощью любых версий sqlite, начиная с 3.0.0. Если этот флаг сброшен, базы данных создаются в новейшем формате, который может быть несовместим с прежними версиями sqlite.
Этот флаг действует только на новые базы данных.
Размер страницы
PRAGMA page_size;PRAGMA page_size = количество_байт;
Задает или запрашивает размер страницы базы данных. Можно задавать размер страницы только до создания базы данных. Указываемый размер должен быть равен степени числа 2 в диапазоне от 512 до 8192.
Короткие имена столбцов
PRAGMA short_column_names;PRAGMA short_column_names = 0 | 1;
Запрашивает или изменяет состояние флага short_column_names. Этот флаг определяет принцип присвоения имен столбцам данных, возвращаемых операторами SELECT, в которых столбцы заданы с помощью имени или шаблона "*". Обычно используются два формата имен столбцов результатов: имя_таблицы | псевдоним имя_столбца, если оператор SELECT объединяет две или более таблиц, либо имя_столбца, если оператор SELECT содержит запрос к единственной таблице. Если флаг short_column_names установлен, столбцам всегда присваиваются имена во втором формате независимо от того, выполняется ли объединение.
Если установлены оба флага short_column_names и full_column_names, флаг full_column_names имеет приоритет.
Синхронные операции
PRAGMA synchronous;PRAGMA synchronous = FULL; (2)PRAGMA synchronous = NORMAL; (1)PRAGMA synchronous = OFF; (0)
Запрашивает или изменяет состояние флага synchronous. Запрос в первом формате возвращает этот параметр в виде целого числа. Если параметр synchronous равен FULL (2), QDB приостанавливает работу в критически важные моменты, чтобы гарантировать запись данных на диск во избежание повреждения базы данных при отказе операционной системы или отключении питания. Значение FULL обеспечивает максимальную безопасность, но значительно замедляет работу с базой данных. В режиме NORMAL база данных также приостанавливает работу в наиболее критических точках, но реже, чем в режиме FULL. Существует очень низкая (но ненулевая) вероятность повреждения базы данных в режиме NORMAL при отключении питания. На практике гораздо вероятнее выход из строя диска или другого устройства. Если значение synchronous равно OFF (0), QDB немедленно возобновляет работу после передачи данных операционной системе. Сбой приложения, которое использует QDB, не представляет угрозу для данных, однако их повреждение возможно при отказе операционной системы или отключении питания от компьютера до завершения записи данных на диск. При этом в режиме OFF скорость выполнения некоторых операций увеличивается до 50 раз.
По умолчанию значение этого параметра равно FULL.
Временное хранение
PRAGMA temp_store;PRAGMA temp_store = DEFAULT; (0)PRAGMA temp_store = FILE; (1)PRAGMA temp_store = MEMORY; (2)
Запрашивает или изменяет состояние параметра temp_store. Если значение параметра temp_store равно DEFAULT (0), место хранения временных таблиц и индексов определяется макросом TEMP_STORE C-препроцессора при компиляции. Если значение параметра temp_store равно MEMORY (2), временные таблицы и индексы хранятся в памяти. Если значение параметра temp_store равно FILE (1), временные таблицы и индексы хранятся в файле. Команда temp_store_directory позволяет указывать каталог, в котором находится этот файл. При изменении параметра temp_store все существующие временные таблицы, индексы и представления немедленно удаляются.
Этот параметр можно переопределять с помощью макроса C-препроцессора TEMP_STORE на этапе компиляции. В следующей таблице указано место хранения таблиц и индексов TEMP для различных сочетаний макроса TEMP_STORE и параметра temp_store:
TEMP_STORE | PRAGMA temp_store | Место хранения |
---|---|---|
0 | Любое | Файл |
1 | 0 | Файл |
1 | 1 | Файл |
1 | 2 | Память |
2 | 0 | Память |
2 | 1 | Файл |
2 | 2 | Память |
3 | Любое | Память |
Список внешних ключей
PRAGMA foreign_key_list(имя_таблицы);
Получает информацию о каждом внешнем ключе, который ссылается на столбец в указанной таблице, с помощью функции обратного вызова. Эта функция вызывается однократно для каждого столбца каждого внешнего ключа.
Информация об индексе
PRAGMA index_info(имя_индекса);
Получает информацию о каждом столбце (в том числе его имя и номер), на который ссылается указанный индекс, с помощью функции обратного вызова.
Индексный список
PRAGMA index_list(имя_таблицы);
Получает информацию о каждом индексе указанной таблицы с помощью функции обратного вызова. В качестве аргументов указываются имя и флаг уникальности индекса.
Информация о таблице
PRAGMA table_info(имя_таблицы);
Получает информацию о каждом столбце указанной таблицы (в том числе имя столбца, возможность присваивать ему значение NULL
и значение по умолчанию) с помощью функции обратного вызова.
Схема и пользовательская версия
PRAGMA [database.]schema_version;PRAGMA [database.]schema_version = целое_число ;PRAGMA [database.]user_version;PRAGMA [database.]user_version = целое_число ;
Команды schema_version и user_version возвращают или задают версию схемы и пользовательскую версию базы данных соответственно. Параметры schema_version и user_version представляют собой 32-разрядные знаковые целые числа и хранятся в заголовке базы данных.
Обычно QDB самостоятельно изменяет параметр schema_version, инкрементируя версию схемы базы данных при каждом ее изменении (посредством создания или удаления таблицы или индекса). Версия схемы учитывается при выполнении каждого запроса SQL и обеспечивает соответствие внутреннего кеша схемы, который используется при компиляции запроса, и схемы базы данных, к которой обращен запрос. Вмешательство в работу механизма проверки версий путем изменения версии схемы с помощью команды PRAGMA schema_version крайне небезопасно, поскольку может приводить к сбоям в программе и повреждению базы данных. Будьте осторожны при их использовании!
Команда user_version предназначена не для внутреннего использования в QDB, а для вызова из приложений в произвольных целях.
Проверка целостности
PRAGMA integrity_check;PRAGMA integrity_check(целое_число)
Эта команда проверяет целостность всей базы данных — ищет некорректные и искаженные записи, отсутствующие страницы и поврежденные индексы. При обнаружении проблем команда возвращает их текстовые описания в виде нескольких строк с одним столбцом. Анализ завершается при обнаружении целое_число ошибок. По умолчанию целое_число равно 100. При отсутствии ошибок возвращается единственная строка со значением ok.
Выражения в SQL запросах, Ключевые слова, поддерживаемые QDB
Предыдущий раздел: перейти