Часто задаваемые вопросы по SQLite
Часто задаваемые вопросы
- Как создать поле AUTOINCREMENT?
- Какие типы данных поддерживает SQLite?
- SQLite позволяет вставить строку в столбец базы данных типа integer!
- Почему SQLite не позволяет использовать '0' и '0.0' в качестве первичного ключа в разных строках одной таблицы?
- Могут ли несколько приложений или несколько экземпляров одного приложения одновременно обращаться к одному файлу базы данных?
- Безопасен ли SQLite для многопоточности?
- Как перечислить все таблицы/индексы, содержащиеся в базе данных SQLite
- Существуют ли известные ограничения по размеру баз данных SQLite?
- Какой максимальный размер имеет VARCHAR в SQLite?
- Поддерживает ли SQLite тип BLOB?
- Как добавить, удалить или переименовать столбцы в существующей таблице в SQLite?
- Я удалил много данных, но файл базы данных не уменьшился в размерах. Это ошибка?
- Могу ли я использовать SQLite в своём коммерческом продукте без уплаты роялти?
- Как использовать строковый литерал, содержащий вложенный символ одиночной кавычки (')?
- Что такое ошибка SQLITE_SCHEMA и почему она возникает?
- При компиляции SQLite возникают некоторые предупреждения компилятора. Это проблема? Не свидетельствует ли это о низком качестве кода?
- Регистронезависимое сопоставление символов Юникода не работает.
- 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 в этот столбец таблицы, 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 позволяет вставить строку в столбец базы данных типа integer!
Это функция, а не ошибка. SQLite использует динамическую типизацию. Он не навязывает ограничений на типы данных. Данные любого типа могут (обычно) быть вставлены в любой столбец. Вы можете поместить строки произвольной длины в столбцы типа integer, числа с плавающей точкой в логические столбцы или даты в символьные столбцы. Тип данных, который вы назначаете столбцу в команде 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, если несколько процессов могут пытаться получить доступ к файлу одновременно. В Windows, согласно документации Microsoft, блокировка может не работать в файловых системах 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?
См. limits.html для полного обсуждения ограничений SQLite.
(9) Какой максимальный размер имеет VARCHAR в SQLite?
SQLite не накладывает ограничений на длину VARCHAR. Вы можете объявить VARCHAR(10), и SQLite будет рад сохранить строку из 500 миллионов символов. И он сохранит все 500 миллионов символов без изменений. Ваши данные никогда не усекаются. SQLite понимает тип столбца «VARCHAR(N)» как эквивалентный типу «TEXT», независимо от значения N.
(10) Поддерживает ли SQLite тип BLOB?
SQLite позволяет хранить данные BLOB в любом столбце, даже в столбцах, объявленных для хранения других типов. BLOB можно использовать даже как первичные ключи.
(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. Вы никогда не получите ошибку SQLITE_SCHEMA от sqlite3_exec(). Вы также не получите ошибку, если подготовите утверждения с использованием 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 в секунду
На самом деле, SQLite легко выполняет 50 000 или более INSERT-утверждений в секунду на типичном настольном компьютере. Но он выполнит только несколько десятков транзакций в секунду. Скорость транзакций ограничена скоростью вращения вашего жёсткого диска. Транзакция обычно требует двух полных оборотов поддона диска, что на диске с частотой вращения 7200 об/мин ограничивает вас примерно 60 транзакциями в секунду.Скорость транзакций ограничена скоростью жёсткого диска, потому что (по умолчанию) SQLite фактически ожидает, пока данные не будут надёжно сохранены на поверхности диска, прежде чем транзакция будет завершена. Таким образом, если внезапно произойдёт отключение питания или сбой вашей ОС, ваши данные всё ещё будут безопасны. Для получения подробностей прочитайте о атомарном подтверждении в SQLite..
По умолчанию каждое утверждение INSERT — это отдельная транзакция. Но если вы окружете несколько утверждений INSERT с BEGIN...COMMIT, все вставки сгруппируются в одну транзакцию. Время, необходимое для подтверждения транзакции, распределяется между всеми включёнными утверждениями INSERT, поэтому время на одно утверждение INSERT значительно сокращается.
Другой вариант — запустить PRAGMA synchronous=OFF. Эта команда заставит SQLite не ждать, пока данные достигнут поверхности диска, что сделает операции записи значительно быстрее. Но если во время транзакции произойдёт отключение питания, файл базы данных может повредиться.
(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 для более быстрого, но менее тщательного тестирования целостности базы данных.
В зависимости от того, насколько сильно повреждена ваша база данных, вы можете восстановить часть данных, используя командную строку для вывода схемы и содержимого в файл, а затем пересоздать их. К сожалению, когда хрупкий кувшин падает со стены, как правило, невозможно собрать его снова.
(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 amalgamation или из обработанных исходных файлов.Можно построить специальную склейку, которая будет работать с предопределённым набором параметров 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 26 сентября 2020 года.
(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 не открыта с флагами, предотвращающими её создание, она создаётся, если ещё не существует. Новые базы данных изначально пустые. Это может сбить с толку людей, которые случайно открывают разные файлы баз данных в разных контекстах из-за опечатки в имени файла или использования относительного пути, используемого с разными текущими каталогами для процессов открытия.
Эта страница была в последний раз изменена 22.12.2023 14:38:37 UTC
SQLite is in the Public Domain.
https://sqlite.org/faq.html