Часто задаваемые вопросы о SQLite
Часто задаваемые вопросы
- Как создать поле AUTOINCREMENT?
- Какие типы данных поддерживает SQLite?
- SQLite позволяет вставить строку в столбец базы данных целочисленного типа!
- Почему SQLite не позволяет использовать '0' и '0.0' в качестве первичного ключа в двух разных строках одной таблицы?
- Могут ли несколько приложений или несколько экземпляров одного приложения одновременно обращаться к одному файлу базы данных?
- Является ли SQLite потокобезопасной?
- Как вывести список всех таблиц/индексов, содержащихся в базе данных SQLite
- Известны ли ограничения на размер баз данных SQLite?
- Каков максимальный размер VARCHAR в SQLite?
- Поддерживает ли SQLite тип BLOB?
- Как добавить, удалить или переименовать столбцы в существующей таблице SQLite?
- Я удалил много данных, но файл базы данных не стал меньше. Это ошибка?
- Могу ли я использовать SQLite в своем коммерческом продукте без выплаты роялти?
- Как использовать строковый литерал, содержащий апостроф (')?
- Что такое ошибка SQLITE_SCHEMA и почему она возникает?
- При компиляции SQLite я получаю предупреждения компилятора. Разве это не проблема? Разве это не указывает на низкое качество кода?
- Сопоставление символов Unicode без учета регистра не работает.
- INSERT выполняется очень медленно — я могу делать лишь несколько десятков INSERT в секунду
- Я случайно удалил важные данные из базы SQLite. Как их восстановить?
- Что такое ошибка SQLITE_CORRUPT? Что значит, что база данных «повреждена»? Почему возникает эта ошибка?
- Поддерживает ли SQLite внешние ключи?
- При использовании параметров компиляции SQLITE_OMIT_... во время сборки SQLite возникает ошибка компилятора.
- Выражение моего предложения WHERE
column1="column1"не работает. Оно возвращает все строки таблицы, а не только те, в которых столбец column1 имеет значение "column1". - Как создаются синтаксические диаграммы SQLite (также известные как диаграммы «железнодорожных путей»)?
- Стандарт SQL требует соблюдения ограничения UNIQUE, даже если один или несколько столбцов этого ограничения имеют значение NULL, но SQLite этого не делает. Разве это не ошибка?
- Каков номер классификации экспортного контроля (ECCN) для SQLite?
- Мой запрос возвращает не то имя столбца, которое я ожидал. Это ошибка?
- Куда делась моя база данных? (Или: как моя база данных стала пустой?)
(1) Как создать поле AUTOINCREMENT?
Краткий ответ: столбец, объявленный как INTEGER PRIMARY KEY, будет автоматически увеличиваться.
Более подробный ответ: если объявить столбец таблицы как INTEGER PRIMARY KEY, то при вставке значения NULL в этот столбец оно автоматически преобразуется в целое число, которое на единицу больше наибольшего значения этого столбца среди всех остальных строк таблицы, либо в 1, если таблица пуста. Если же уже используется наибольший существующий целочисленный ключ 9223372036854775807, случайным образом выбирается неиспользуемое значение ключа. Например, предположим, что у вас есть такая таблица:
CREATE TABLE t1( a INTEGER PRIMARY KEY, b INTEGER );Для этой таблицы инструкция
INSERT INTO t1 VALUES(NULL,123);логически эквивалентна следующей:
INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);Существует функция sqlite3_last_insert_rowid(), которая возвращает целочисленный ключ последней операции вставки.
Обратите внимание, что целочисленный ключ на единицу больше наибольшего ключа, который был в таблице непосредственно перед вставкой. Новый ключ будет уникальным среди всех ключей, находящихся в таблице в данный момент, но может совпасть с ключами, которые ранее были удалены из таблицы. Чтобы создавать ключи, уникальные на протяжении всего срока существования таблицы, добавьте ключевое слово AUTOINCREMENT в объявление INTEGER PRIMARY KEY. Тогда выбранный ключ будет на единицу больше наибольшего ключа, который когда-либо существовал в этой таблице. Если в этой таблице ранее уже существовал наибольший возможный ключ, инструкция INSERT завершится с кодом ошибки SQLITE_FULL.
(2) Какие типы данных поддерживает SQLite?
SQLite использует динамическую типизацию. Данные могут храниться как INTEGER, REAL, TEXT, BLOB или NULL.
(3) SQLite позволяет вставить строку в столбец базы данных целочисленного типа!
Это особенность, а не ошибка. SQLite использует динамическую типизацию. Ограничения на типы данных не применяются. (Как правило,) данные любого типа можно вставить в любой столбец. В целочисленные столбцы можно помещать строки произвольной длины, в логические — числа с плавающей точкой, а в символьные — даты. Тип данных, назначенный столбцу в команде CREATE TABLE, не ограничивает тип данных, которые можно поместить в этот столбец. Каждый столбец может содержать строку произвольной длины. (Есть одно исключение: столбцы типа INTEGER PRIMARY KEY могут содержать только 64-битное знаковое целое число. Если попытаться поместить в столбец INTEGER PRIMARY KEY что-либо, кроме целого числа, произойдет ошибка.)
Однако SQLite использует объявленный тип столбца как подсказку о том, значения какого формата вы предпочитаете. Например, если столбец имеет тип INTEGER и вы пытаетесь вставить в него строку, SQLite попытается преобразовать строку в целое число. Если это удастся, будет вставлено целое число. В противном случае будет вставлена строка. Эта особенность называется типовым сродством.
(4) Почему SQLite не позволяет использовать '0' и '0.0' в качестве первичного ключа в двух разных строках одной таблицы?
This problem occurs when your primary key is a numeric type. Change the datatype of your primary key to TEXT and it should work. Every row must have a unique primary key. For a column with a numeric type, SQLite thinks that '0' and '0.0' are the same value because they compare equal to one another numerically. (See the previous question.) Hence the values are not unique.
(5) Могут ли несколько приложений или несколько экземпляров одного приложения одновременно обращаться к одному файлу базы данных?
Несколько процессов могут одновременно открыть одну и ту же базу данных. Несколько процессов могут одновременно выполнять SELECT. Однако в каждый конкретный момент только один процесс может вносить изменения в базу данных.
Для управления доступом к базе данных SQLite использует блокировки чтения/записи. (В Windows 95/98/ME, где отсутствует поддержка блокировок чтения/записи, вместо этого используется вероятностная имитация.) Но соблюдайте осторожность: этот механизм блокировок может работать неправильно, если файл базы данных находится в файловой системе NFS. Это связано с тем, что блокировка файлов с помощью fcntl() неисправна во многих реализациях NFS. Не следует размещать файлы баз данных SQLite в NFS, если несколько процессов могут пытаться одновременно получить к ним доступ. Согласно документации Microsoft, в Windows блокировки могут не работать в файловых системах FAT, если не запущена служба Share.exe. Люди с большим опытом работы в Windows сообщают мне, что блокировка сетевых файлов работает с ошибками и ненадежна. Если это так, совместное использование базы SQLite двумя или более компьютерами под управлением Windows может привести к неожиданным проблемам.
Нам неизвестны другие встраиваемые движки баз данных SQL, поддерживающие такую же степень параллелизма, как SQLite. SQLite позволяет нескольким процессам одновременно открывать файл базы данных, а также нескольким процессам одновременно читать базу данных. Когда процессу требуется выполнить запись, он должен заблокировать весь файл базы данных на время обновления. Обычно это занимает всего несколько миллисекунд. Остальные процессы просто ждут завершения записи, а затем продолжают работу. Другие встраиваемые движки баз данных SQL обычно позволяют подключаться к базе данных только одному процессу одновременно.
Однако клиент-серверные движки баз данных (например, PostgreSQL, MySQL или Oracle) обычно поддерживают более высокий уровень параллелизма и позволяют нескольким процессам одновременно записывать данные в одну и ту же базу. Это возможно в клиент-серверной базе данных, поскольку для координации доступа всегда доступен единый хорошо контролируемый серверный процесс. Если вашему приложению требуется высокий уровень параллелизма, рассмотрите возможность использования клиент-серверной базы данных. Однако опыт показывает, что большинству приложений требуется гораздо меньший уровень параллелизма, чем предполагают их разработчики.
Когда SQLite пытается получить доступ к файлу, заблокированному другим процессом, по умолчанию возвращается SQLITE_BUSY. Это поведение можно настроить в коде C с помощью API-функций sqlite3_busy_handler() или sqlite3_busy_timeout().
(6) Является ли SQLite потокобезопасной?
Потоки — это зло. Избегайте их.
SQLite потокобезопасна. Мы допускаем это, поскольку многие пользователи предпочитают игнорировать совет из предыдущего абзаца. Но для обеспечения потокобезопасности SQLite должна быть скомпилирована с макросом препроцессора SQLITE_THREADSAFE, установленным в 1. Предварительно скомпилированные двоичные файлы для Windows и Linux, входящие в дистрибутив, собраны именно таким образом. Если вы не уверены, что используемая вами библиотека SQLite скомпилирована с поддержкой потокобезопасности, вызовите интерфейс sqlite3_threadsafe(), чтобы это проверить.
SQLite потокобезопасна, поскольку для сериализации доступа к общим структурам данных использует мьютексы. Однако захват и освобождение этих мьютексов немного замедляют работу SQLite. Поэтому, если потокобезопасность SQLite вам не нужна, отключите мьютексы для достижения максимальной производительности. Дополнительные сведения см. в документации о режиме многопоточности.
В Unix не следует переносить открытую базу данных SQLite в дочерний процесс через системный вызов fork().
(7) Как вывести список всех таблиц/индексов, содержащихся в базе данных SQLite
If you are running the sqlite3 command-line access program you can type ".tables" to get a list of all tables. Or you can type ".schema" to see the complete database schema including all tables and indices. Either of these commands can be followed by a LIKE pattern that will restrict the tables that are displayed. From within a C/C++ program (or a script using Tcl/Ruby/Perl/Python bindings) you can get access to table and index names by doing a SELECT on a special table named "SQLITE_SCHEMA". Every SQLite database has an SQLITE_SCHEMA table that defines the schema for the database. The SQLITE_SCHEMA table looks like this:
CREATE TABLE sqlite_schema (
type TEXT,
name TEXT,
tbl_name TEXT,
rootpage INTEGER,
sql TEXT
);
For tables, the type field will always be 'table' and the name field will be the name of the table. So to get a list of all tables in the database, use the following SELECT command:
SELECT name FROM sqlite_schema
WHERE type='table'
ORDER BY name;
For indices, type is equal to 'index', name is the name of the index and tbl_name is the name of the table to which the index belongs. For both tables and indices, the sql field is the text of the original CREATE TABLE or CREATE INDEX statement that created the table or index. For automatically created indices (used to implement the PRIMARY KEY or UNIQUE constraints) the sql field is NULL. The SQLITE_SCHEMA table cannot be modified using UPDATE, INSERT, or DELETE (except under extraordinary conditions). The SQLITE_SCHEMA table is automatically updated by commands like CREATE TABLE, CREATE INDEX, DROP TABLE, and DROP INDEX. Temporary tables do not appear in the SQLITE_SCHEMA table. Temporary tables and their indices and triggers occur in another special table named SQLITE_TEMP_SCHEMA. SQLITE_TEMP_SCHEMA works just like SQLITE_SCHEMA except that it is only visible to the application that created the temporary tables. To get a list of all tables, both permanent and temporary, one can use a command similar to the following:
SELECT name FROM
(SELECT * FROM sqlite_schema UNION ALL
SELECT * FROM sqlite_temp_schema)
WHERE type='table'
ORDER BY name
(8) Известны ли ограничения на размер баз данных SQLite?
Полное обсуждение ограничений SQLite см. в разделе limits.html.
(9) Каков максимальный размер VARCHAR в SQLite?
SQLite не ограничивает длину VARCHAR. Можно объявить VARCHAR(10), и SQLite без проблем сохранит в таком столбце строку длиной 500 миллионов символов. Все 500 миллионов символов останутся без изменений. Содержимое никогда не усекается. SQLite трактует тип столбца "VARCHAR(N)" так же, как "TEXT", независимо от значения N.
(10) Поддерживает ли SQLite тип BLOB?
SQLite позволяет хранить данные BLOB в любом столбце, даже если столбец объявлен для хранения данных другого типа. BLOB также можно использовать в качестве PRIMARY KEY.
(11) Как добавить, удалить или переименовать столбцы в существующей таблице SQLite?
В SQLite реализована ограниченная поддержка ALTER TABLE, с помощью которой можно добавлять, переименовывать и удалять столбцы, а также менять имя таблицы, как описано в разделе ALTER TABLE.
Если требуется внести более сложные изменения в структуру или ограничения таблицы либо ее столбцов, таблицу придется пересоздать. Сохраните существующие данные во временной таблице, удалите старую таблицу, создайте новую, а затем скопируйте в нее данные из временной таблицы. Порядок действий описан в разделе Изменение схемы таблицы другими способами.
(12) Я удалил много данных, но файл базы данных не стал меньше. Это ошибка?
Нет. При удалении данных из базы SQLite освободившееся дисковое пространство добавляется во внутренний «список свободных областей» и повторно используется при следующей вставке данных. Дисковое пространство не теряется, но и не возвращается операционной системе.
Если вы удалили много данных и хотите уменьшить файл базы данных, выполните команду VACUUM. VACUUM заново создаст базу данных. В результате список свободных областей опустеет, а файл станет минимального размера. Однако обратите внимание: выполнение VACUUM может занять некоторое время, а во время работы для него может потребоваться временное дисковое пространство объемом до двух размеров исходного файла.
Вместо команды VACUUM можно использовать режим автоматической очистки, включив его с помощью прагмы auto_vacuum.
(13) Могу ли я использовать SQLite в своем коммерческом продукте без выплаты роялти?
Да. SQLite находится в общественном достоянии. Никаких прав собственности на какую-либо часть кода не заявлено. Вы можете делать с ним все, что захотите.
(14) Как использовать строковый литерал, содержащий апостроф (')?
Согласно стандарту SQL, апострофы в строках экранируются путем удвоения. В этом отношении SQL работает так же, как язык программирования Pascal. Пример:
INSERT INTO xyz VALUES('5 O''clock');
(15) Что такое ошибка SQLITE_SCHEMA и почему она возникает?
Ошибка SQLITE_SCHEMA возвращается, когда подготовленная инструкция SQL больше недействительна и не может быть выполнена. В этом случае инструкцию необходимо заново скомпилировать из SQL с помощью API sqlite3_prepare(). Ошибка SQLITE_SCHEMA может возникнуть только при использовании интерфейсов sqlite3_prepare() и sqlite3_step() для выполнения SQL. При вызове sqlite3_exec() вы никогда не получите ошибку SQLITE_SCHEMA. Ошибка также не возникнет, если подготавливать инструкции с помощью sqlite3_prepare_v2() вместо sqlite3_prepare().
Интерфейс sqlite3_prepare_v2() создает подготовленную инструкцию, которая автоматически перекомпилируется при изменении схемы. Самый простой способ избежать ошибок SQLITE_SCHEMA — всегда использовать sqlite3_prepare_v2() вместо sqlite3_prepare().
(17) При компиляции SQLite я получаю предупреждения компилятора. Разве это не проблема? Разве это не указывает на низкое качество кода?
Контроль качества SQLite обеспечивается с помощью тестирования с полным покрытием, а не предупреждений компилятора или других инструментов статического анализа кода. Иными словами, мы проверяем, что SQLite действительно выдает правильный результат, а не просто соблюдает стилистические ограничения. Большая часть кодовой базы SQLite предназначена исключительно для тестирования. Набор тестов SQLite выполняет десятки тысяч отдельных тестов, причем многие из них параметризованы, так что перед каждым выпуском запускаются и проверяются на корректность сотни миллионов тестов, включающих миллиарды инструкций SQL. Разработчики используют инструменты анализа покрытия кода, чтобы убедиться, что проверены все пути выполнения кода. Каждый раз, когда в SQLite обнаруживается ошибка, пишутся новые тесты, демонстрирующие ее, чтобы она не могла повториться в будущем незамеченной.
Во время тестирования библиотека SQLite компилируется со специальной инструментализацией, которая позволяет тестовым сценариям имитировать самые разные сбои и проверять корректность восстановления SQLite. Распределение памяти тщательно отслеживается, утечек памяти не происходит даже при сбоях выделения памяти. Специальный слой VFS используется для имитации сбоев операционной системы и отключения питания, чтобы гарантировать атомарность транзакций при таких событиях. Механизм преднамеренного внесения ошибок ввода-вывода показывает, что SQLite устойчив к подобным неисправностям. (Попробуйте вызвать ошибки такого типа в других движках баз данных SQL и посмотрите, что произойдет!)
Кроме того, мы запускаем SQLite под Valgrind в Linux и проверяем, что он не обнаруживает проблем.
Некоторые утверждают, что следует устранить все предупреждения, поскольку безвредные предупреждения маскируют настоящие, которые могут появиться после будущих изменений. Это справедливо. Однако разработчики отмечают, что все предупреждения уже устранены в сборках, используемых при разработке SQLite (различные версии GCC, MSVC и clang). Предупреждения компилятора обычно возникают только при использовании компиляторов или параметров компиляции, которыми разработчики SQLite сами не пользуются.
(18) Сопоставление символов Unicode без учета регистра не работает.
В конфигурации SQLite по умолчанию сравнение без учета регистра поддерживается только для символов ASCII. Причина в том, что для полноценного сравнения без учета регистра и преобразования регистра Unicode нужны таблицы и логика, которые почти вдвое увеличили бы размер библиотеки SQLite. Разработчики SQLite считают, что приложениям, которым нужна полная поддержка регистра Unicode, вероятно, уже доступны необходимые таблицы и функции, поэтому SQLite не следует занимать место дублированием этой функциональности.Вместо того чтобы по умолчанию обеспечивать полную поддержку регистра Unicode, SQLite позволяет связываться с внешними процедурами сравнения и преобразования Unicode. Приложение может переопределить встроенную последовательность сортировки NOCASE (с помощью sqlite3_create_collation()), а также встроенные функции like(), upper() и lower() (с помощью sqlite3_create_function()). В исходный код SQLite входит расширение "ICU", реализующее такие переопределения. Разработчики также могут написать собственные переопределения, используя уже имеющиеся в их проекте процедуры сравнения с поддержкой Unicode.
(19) INSERT выполняется очень медленно — я могу делать лишь несколько десятков INSERT в секунду
Actually, SQLite will easily do 50,000 or more INSERT statements per second on an average desktop computer. But it will only do a few dozen transactions per second. Transaction speed is limited by the rotational speed of your disk drive. A transaction normally requires two complete rotations of the disk platter, which on a 7200RPM disk drive limits you to about 60 transactions per second. Transaction speed is limited by disk drive speed because (by default) SQLite actually waits until the data really is safely stored on the disk surface before the transaction is complete. That way, if you suddenly lose power or if your OS crashes, your data is still safe. For details, read about atomic commit in SQLite.. By default, each INSERT statement is its own transaction. But if you surround multiple INSERT statements with BEGIN...COMMIT then all the inserts are grouped into a single transaction. The time needed to commit the transaction is amortized over all the enclosed insert statements and so the time per insert statement is greatly reduced. Another option is to run PRAGMA synchronous=OFF. This command will cause SQLite to not wait on data to reach the disk surface, which will make write operations appear to be much faster. But if you lose power in the middle of a transaction, your database file might go corrupt. Update 2024-11-19: The text above is a really old answer. SQLite will do far more than 50K inserts/second now, and everybody uses SSD nowadays, making the performance faster still. But the gist of the answer above remains correct: Putting multiple operations inside a single transaction can improve performance dramatically by avoiding the overhead of transaction control after each individual operation.
(20) Я случайно удалил важные данные из базы SQLite. Как их восстановить?
Если у вас есть резервная копия файла базы данных, восстановите данные из нее.Если резервной копии нет, восстановление будет очень сложным. Возможно, удастся найти фрагменты строковых данных в двоичном дампе исходного файла базы данных. Восстановить числовые данные тоже может быть возможно с помощью специальных инструментов, хотя, насколько нам известно, таких инструментов не существует. Иногда SQLite компилируется с параметром SQLITE_SECURE_DELETE, при котором все удаленные данные перезаписываются нулями. В этом случае восстановление, очевидно, невозможно. Восстановление также невозможно, если после удаления данных вы выполнили VACUUM. Если параметр SQLITE_SECURE_DELETE не использовался и команда VACUUM не выполнялась, некоторые удаленные данные могут все еще находиться в файле базы данных в областях, помеченных для повторного использования. Но, опять же, нам неизвестны какие-либо процедуры или инструменты, которые помогли бы восстановить эти данные.
(21) Что такое ошибка SQLITE_CORRUPT? Что значит, что база данных «повреждена»? Почему возникает эта ошибка?
Ошибка SQLITE_CORRUPT возвращается, когда SQLite обнаруживает ошибку в структуре, формате или других управляющих элементах файла базы данных.
SQLite не повреждает файлы баз данных без внешнего вмешательства. Если приложение аварийно завершится в середине обновления, ваши данные останутся в безопасности. База данных останется в безопасности, даже если произойдет сбой ОС или отключение питания. Устойчивость SQLite к сбоям тщательно изучалась и проверялась и подтверждена многолетним опытом реального использования миллиардами пользователей.
Тем не менее есть ряд действий внешних программ, а также ошибок оборудования или ОС, которые могут повредить файл базы данных. Дополнительные сведения см. в разделе Как повредить файл базы данных SQLite.
Для тщательной, но занимающей много времени проверки целостности базы данных можно использовать PRAGMA integrity_check.
Для более быстрой, но менее тщательной проверки целостности базы данных можно использовать PRAGMA quick_check.
В зависимости от степени повреждения базы данных можно попытаться восстановить часть данных: с помощью CLI выгрузить схему и содержимое в файл, а затем пересоздать базу. К сожалению, когда все уже испорчено, как правило, восстановить исходное состояние невозможно.
(22) Поддерживает ли SQLite внешние ключи?
Начиная с версии 3.6.19 (2009-10-14), SQLite поддерживает ограничения внешних ключей. Однако проверка ограничений внешних ключей по умолчанию отключена (для обратной совместимости). Чтобы включить проверку ограничений внешних ключей, выполните PRAGMA foreign_keys=ON или скомпилируйте с параметром -DSQLITE_DEFAULT_FOREIGN_KEYS=1.
(23) При использовании параметров компиляции SQLITE_OMIT_... во время сборки SQLite возникает ошибка компилятора.
Параметры компиляции SQLITE_OMIT_... работают только при сборке из канонических исходных файлов. Они не работают при сборке из амальгамации SQLite или предварительно обработанных исходных файлов.Можно создать специальную амальгамацию, которая будет работать с заранее заданным набором параметров SQLITE_OMIT_.... Инструкции приведены в документации SQLITE_OMIT_....
(24) Выражение моего предложения WHERE column1="column1" не работает. Оно возвращает все строки таблицы, а не только те, в которых столбец column1 имеет значение "column1".
Для строковых литералов в SQL используйте одинарные кавычки, а не двойные. Этого требует стандарт SQL. Выражение вашего предложения WHERE должно выглядеть так:column1='column1'В SQL двойные кавычки используются вокруг идентификаторов (имен столбцов или таблиц), содержащих специальные символы или являющихся ключевыми словами. Таким образом, двойные кавычки позволяют экранировать имена идентификаторов. Поэтому запись
column1="column1"эквивалентна записиcolumn1=column1, которая, очевидно, всегда истинна.
(25) Как создаются синтаксические диаграммы SQLite (также известные как диаграммы «железнодорожных путей»)?
Каждая диаграмма вручную создается на языке диаграмм Pikchr. Эти написанные вручную спецификации преобразуются в SVG и встраиваются в HTML-файлы в рамках процесса сборки документации.Во многих исторических версиях документации SQLite для создания синтаксических диаграмм использовался другой процесс. Он был основан на Tcl/Tk и описан на странице http://wiki.tcl-lang.org/21708. Новые синтаксические диаграммы на основе Pikchr впервые появились в trunk 2020-09-26.
(26) Стандарт SQL требует соблюдения ограничения UNIQUE, даже если один или несколько столбцов этого ограничения имеют значение NULL, но SQLite этого не делает. Разве это не ошибка?
Возможно, вы имеете в виду следующее положение стандарта SQL92:Ограничение уникальности выполняется тогда и только тогда, когда никакие две строки таблицы не имеют одинаковых ненулевых значений в столбцах, для которых задана уникальность.Это утверждение неоднозначно и допускает как минимум две интерпретации:SQLite следует интерпретации (1), как и PostgreSQL, MySQL, Oracle и Firebird. Действительно, Informix и Microsoft SQL Server используют интерпретацию (2), однако мы, разработчики SQLite, считаем интерпретацию (1) наиболее естественным прочтением этого требования. Кроме того, мы стремимся к максимальной совместимости с другими движками баз данных SQL, большинство из которых также придерживается интерпретации (1). Поэтому SQLite работает именно так.
- Ограничение уникальности выполняется тогда и только тогда, когда никакие две строки таблицы не имеют одинаковых значений и ненулевых значений в столбцах, для которых задана уникальность.
- Ограничение уникальности выполняется тогда и только тогда, когда никакие две строки таблицы не имеют одинаковых значений в подмножестве столбцов с ограничением уникальности, которые не равны NULL.
(27) Каков номер классификации экспортного контроля (ECCN) для SQLite?
After careful review of the Commerce Control List (CCL), we are convinced that the core public-domain SQLite source code is not described by any ECCN, hence the ECCN should be reported as EAR99. The above is true for the core public-domain SQLite. If you extend SQLite by adding new code, or if you statically link SQLite with your application, that might change the ECCN in your particular case.
(28) Мой запрос возвращает не то имя столбца, которое я ожидал. Это ошибка?
Если имена столбцов результирующего набора заданы предложениями AS, SQLite гарантированно использует в качестве имени столбца идентификатор справа от ключевого слова AS. Если в результирующем наборе не используется предложение AS, SQLite может присвоить столбцу любое имя. Дополнительные сведения см. в документации sqlite3_column_name().
(29) Куда делась моя база данных? (Или: как моя база данных стала пустой?)
Если не указаны флаги, предотвращающие это, SQLite создает базу данных, если она еще не существует. Созданные базы данных изначально пусты. Это может сбить пользователей с толку, если в разных контекстах они по ошибке открывают разные файлы баз данных из-за опечатки в имени файла или использования относительного пути, который разрешается по-разному в зависимости от текущих каталогов процессов, открывающих базу данных.
Последнее обновление этой страницы: 2024-11-26 23:53:35Z
SQLite is in the Public Domain.
https://sqlite.org/faq.html