Наш ассоциированный член www.Bikinika.com.ua

Часті запитання SQLite

Малий. Швидко. Надійний.
Виберіть будь-яку три.

  1. Як створити поле AUTOINCREMENT?
  2. Які типи даних підтримують SQLite?
  3. SQLite дозволяє вставляти рядок у стовпчик бази даних типу integer!
  4. Чому SQLite не дозволяє використовувати '0' і '0.0' як первинний ключ на двох різних рядках однієї таблиці?
  5. Чи можуть декілька програм або декілька екземплярів одного й того самого додатка одночасно отримати доступ до одного файлу бази даних?
  6. Чи є SQLite нитки безпечним?
  7. Як перерахувати всі таблиці / індекси, що містяться в базі даних SQLite
  8. Чи існують відомі обмеження розміру баз даних SQLite?
  9. Який максимальний розмір VARCHAR в SQLite?
  10. Чи підтримує SQLite тип BLOB?
  11. Як додати або видалити стовпці з існуючої таблиці в SQLite.
  12. Я видалив багато даних, але файл бази даних не став меншим. Це помилка?
  13. Чи можна використовувати SQLite у своєму комерційному продукті без сплати роялті?
  14. Як я можу використовувати строковий літерал, що містить вбудований символ з однією цитатою?
  15. Що таке помилка SQLITE_SCHEMA і чому я її отримую?
  16. Чому ROUND (9,95,1) повертає 9,9 замість 10,0? Не варто 9,95 округлити?
  17. Я отримую попередження про компілятор, коли я компілюю SQLite. Хіба це не проблема? Хіба це не означає якість коду?
  18. Невідповідність регістру символів Unicode не працює.
  19. INSERT дуже повільно - я можу робити лише кілька десятків INSERTs в секунду
  20. Я випадково видалив деякі важливі відомості з бази даних SQLite. Як я можу його відновити?
  21. Що таке помилка SQLITE_CORRUPT? Що це означає, що база даних буде "неправильно сформована"? Чому я отримую цю помилку?
  22. Чи підтримує SQLite зовнішні ключі?
  23. Я отримую помилку компілятора, якщо я використовую параметри часу компіляції SQLITE_OMIT _... при побудові SQLite.
  24. Мій вираз выраження WHERE column1 = "column1" не працює. Це призводить до повернення кожного рядка таблиці, а не тільки до рядків, у яких стовпець1 має значення "column1".
  25. Як формуються синтаксичні діаграми (так звані "залізничні" діаграми) для SQLite?
  26. Стандарт SQL вимагає, щоб обмеження UNIQUE виконувалося, навіть якщо один або більше стовпців у обмеженні NULL, але SQLite цього не робить. Хіба це не помилка?
  27. Що таке Класифікаційний номер експортного контролю (ECCN) для SQLite?
  28. Мій запит не повертає назви стовпця, який я очікую. Це помилка?

(1) Як створити поле AUTOINCREMENT?

Коротка відповідь: Колона оголошена INTEGER PRIMARY KEY буде автоінкремент.

Більше відповідь: Якщо ви оголосите стовпець таблиці INTEGER PRIMARY KEY , тоді щоразу, коли ви вставляєте NULL у цей стовпець таблиці, NULL автоматично перетворюється на ціле число, яке більше одного найбільшого значення цього стовпця над усіма іншими рядками таблиці, або 1, якщо таблиця порожня. Або, якщо використовується найбільший існуючий цілочисельний ключ 9223372036854775807, тоді невикористане значення ключа вибирається випадковим чином. Наприклад, припустимо, що ви маєте таку таблицю:

Створити таблицю t1 (INTEGER PRIMARY KEY, b INTEGER);

З цією таблицею, заявою

INSERT INTO VALUES (NULL, 123);

логічно еквівалентне:

INSERT INTO t1 VALUES ((ВИБІР max (a) ВІД 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 динамічне введення . Він не застосовує обмеження типу даних. Дані будь-якого типу можуть (як правило) вставлятися в будь-яку колонку. Ви можете помістити рядки довільної довжини в цілі колонки, числа з плаваючою точкою в булевих стовпцях або дати у стовпцях символів. The тип даних Ви привласнюєте стовпець у команді CREATE TABLE не обмежує, які дані можуть бути введені в цей стовпець. Кожен стовпець може утримувати рядок довжини довільної довжини. (Є одне виключення: стовпці типу INTEGER PRIMARY KEY може містити лише 64-бітове ціле число. Виникне помилка, якщо ви спробуєте помістити щось інше, ніж ціле число INTEGER PRIMARY KEY стовпець.)

Але SQLite використовує оголошений тип стовпця як підказку, що ви віддаєте перевагу значенням у цьому форматі. Так, наприклад, якщо стовпець типу INTEGER і ви намагаєтеся вставити рядок у цей стовпець, SQLite спробує перетворити рядок у ціле число. Якщо це можливо, замість цього вставляє ціле число. Якщо ні, то вставляє рядок. Ця функція викликається тип спорідненості .

(4) Чому SQLite не дозволяє мені використовувати '0' і '0.0' як первинний ключ на двох різних рядках однієї таблиці?

Ця проблема виникає, коли первинний ключ є числовим типом. Змінити тип даних вашого первинного ключа в TEXT і він повинен працювати.

Кожен рядок повинен мати унікальний первинний ключ. Для стовпця з числовим типом SQLite вважає, що '0' і '0.0' мають одне і те ж значення, тому що вони чисельно порівнюються між собою. (Див. Попереднє запитання.) Отже, значення не є унікальними.

(5) Чи можуть декілька додатків або декілька екземплярів одного й того ж додатка одночасно отримати доступ до одного файлу бази даних?

Кілька процесів можуть мати одну й ту ж базу даних одночасно. Кілька процесів можуть виконувати SELECT одночасно. Але тільки один процес може вносити зміни до бази даних у будь-який момент часу.

Для керування доступом до бази даних SQLite використовує замки читання / запису. (У Win95 / 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 за допомогою sqlite3_busy_handler () або sqlite3_busy_timeout () Функції API.

(6) Чи є SQLite нитки безпечним?

Нитки зло . Уникайте їх.

SQLite є безпечним для потоків. Ми робимо цю поступку, оскільки багато користувачів вирішили ігнорувати рекомендації, наведені в попередньому параграфі. Але для того, щоб бути потокобезпечним, SQLite повинен бути скомпільований з макросом препроцесора SQLITE_THREADSAFE, встановленим на 1. Обидва скомпільовані Windows і Linux складені у цьому дистрибутиві компілюються таким чином. Якщо ви не впевнені, що бібліотека SQLite, з якою ви зв'язуєтеся, компілюється як безпечна для потоків, ви можете викликати sqlite3_threadsafe () інтерфейс для з'ясування.

SQLite є безпечним для потоків, оскільки він використовує мьютекси для серіалізації доступу до загальних структур даних. Тим не менш, робота з придбання та випуску цих мьютексів повільно зменшить SQLite. Отже, якщо вам не потрібно SQLite бути потокобезпечним, ви повинні вимкнути мьютекси для максимальної продуктивності. Див режим різьби документацію для отримання додаткової інформації.

Під Unix не слід переносити відкриту базу даних SQLite через системний виклик fork () у дочірньому процесі.

(7) Як перерахувати всі таблиці / індекси, що містяться в базі даних SQLite

Якщо ви виконуєте програму доступу до командного рядка sqlite3, ви можете ввести " .tables ", щоб отримати список всіх таблиць. Або ви можете ввести " .schema ", щоб побачити повну схему бази даних, включаючи всі таблиці та індекси. Кожна з цих команд може супроводжуватися шаблоном LIKE, який обмежує відображення таблиць.

З програми C / C ++ (або скрипта, що використовує прив'язки Tcl / Ruby / Perl / Python), ви можете отримати доступ до імен таблиць і індексів, виконавши SELECT на спеціальній таблиці з назвою " SQLITE_MASTER ". Кожна база даних SQLite має таблицю SQLITE_MASTER, яка визначає схему для бази даних. Таблиця SQLITE_MASTER виглядає так:

CREATE TABLE sqlite_master (введіть TEXT, назвіть TEXT, tbl_name TEXT, rootpage INTEGER, sql TEXT);

Для таблиць поле типу завжди буде 'table', а поле name буде назвою таблиці. Отже, щоб отримати список всіх таблиць у базі даних, використовуйте наступну команду SELECT:

Ім'я SELECT FROM sqlite_master WHERE type = 'table' ORDER BY name;

Для індексів тип дорівнює "index" , ім'я - ім'я індексу, а tbl_name - назва таблиці, до якої належить індекс. Для таблиць і індексів поле sql є текстом оригінального оператора CREATE TABLE або CREATE INDEX, який створив таблицю або індекс. Для автоматично створених індексів (які використовуються для реалізації обмежень PRIMARY KEY або UNIQUE) поле sql має значення NULL.

Таблиця SQLITE_MASTER доступна лише для читання. Ви не можете змінити цю таблицю за допомогою UPDATE, INSERT або DELETE. Таблиця автоматично оновлюється командами CREATE TABLE, CREATE INDEX, DROP TABLE і DROP INDEX.

Тимчасові таблиці не відображаються в таблиці SQLITE_MASTER. Тимчасові таблиці та їхні індекси та тригери відбуваються в іншій спеціальній таблиці з назвою SQLITE_TEMP_MASTER. SQLITE_TEMP_MASTER працює так само, як SQLITE_MASTER, за винятком того, що він видно лише для програми, яка створила тимчасові таблиці. Щоб отримати список всіх таблиць, як постійних, так і тимчасових, можна використовувати команду, подібну до наступної:

SELECT ім'я FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE тип = 'таблиця' ORDER BY ім'я

(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 можуть бути навіть використані як PRIMARY KEYs.

(11) Як додати або видалити стовпці з існуючої таблиці в SQLite.

SQLite обмежений ALTER TABLE підтримка, яку можна використовувати для додавання стовпця до кінця таблиці або для зміни назви таблиці. Якщо ви хочете зробити більш складні зміни в структурі таблиці, вам доведеться відтворити таблицю. Можна зберегти існуючі дані до тимчасової таблиці, скинути стару таблицю, створити нову таблицю, а потім скопіювати дані з тимчасової таблиці.

Наприклад, припустимо, що у вас є таблиця з іменами "t1" з назвами стовпців "a", "b" і "c", і ви хочете видалити стовпець "c" з цієї таблиці. Наступні кроки ілюструють, як це можна зробити:

НАЧАТИ ТРАНЗАКЦІЮ; Створити тимчасову таблицю t1_backup (a, b); INSERT INTO t1_backup SELECT a, b FROM t1; ТАБЛИЦЯ КРОПУ t1; Створити таблицю t1 (a, b); INSERT INTO t1 SELECT a, b ВІД t1_backup; DROP TABLE t1_backup; COMMIT;

(12) Я видалив багато даних, але файл бази даних не став меншим. Це помилка?

Коли ви видаляєте інформацію з бази даних SQLite, невикористаний дисковий простір буде додано до внутрішнього "списку вільних списків" і повторно використані під час наступного вставки даних. Простір на диску не втрачається. Але не повертається до операційної системи.

Якщо ви видалите багато даних і хочете зменшити файл бази даних, запустіть ВАКУУМ команду. VACUUM відновить базу даних з нуля. Це залишить базу даних з порожнім вільним списком і файлом з мінімальним розміром. Зауважте, однак, що VACUUM може зайняти деякий час, і воно може використовувати вдвічі більше тимчасового дискового простору, як і вихідний файл під час його запуску.

Альтернативою користуванню командою VACUUM є режим автоматичного вакуумування, увімкнений за допомогою auto_vacuum pragma .

(13) Чи можу я використовувати SQLite у своєму комерційному продукті без сплати роялті?

Так. SQLite знаходиться в публічний домен . Жодна претензія на право власності на будь-яку частину коду не подається. З ним можна робити все, що завгодно.

(14) Як я можу використовувати строковий літерал, що містить вбудований символ однієї цитати (')?

Стандарт SQL визначає, що одиночні лапки у рядках виділяються шляхом введення двох одинарних лапок підряд. SQL в цьому відношенні працює як мова програмування Pascal. Приклад:

INSERT INTO xyz VALUES ("5 годин");

(15) Що таке помилка SQLITE_SCHEMA, і чому я її отримую?

An SQLITE_SCHEMA Помилка повертається, коли підготовлений оператор SQL більше не є дійсним і не може бути виконаний. Коли це відбувається, оператор повинен бути перекомпільований з SQL за допомогою sqlite3_prepare () API. Помилка SQLITE_SCHEMA може виникати лише при використанні sqlite3_prepare () , і sqlite3_step () інтерфейсів для запуску SQL. Ви ніколи не отримаєте SQLITE_SCHEMA помилка від sqlite3_exec () . Ви також не отримаєте помилку, якщо ви готуєте заяви з використанням sqlite3_prepare_v2 () замість sqlite3_prepare () .

The sqlite3_prepare_v2 () інтерфейс створює a підготовлену заяву який автоматично перекомпілюватиметься, якщо змінюється схема. Найпростіший спосіб боротися SQLITE_SCHEMA помилки завжди використовуються sqlite3_prepare_v2 () замість sqlite3_prepare () .

(16) Чому ROUND (9,95,1) повертає 9,9 замість 10,0? Не варто 9,95 округлити?

SQLite використовує двійкову арифметику і в двійковому, немає способу записати 9.95 в кінцевому числі бітів. Найбільш близьким до вас може бути 9,95 у 64-бітному IEEE float (що використовує SQLite) 9.949999999999999289457264239899814128875732421875. Тому, коли ви вводите "9.95", SQLite дійсно розуміє, що це число є набагато довшим значенням, показаним вище. І це значення обходиться вниз.

Така проблема виникає постійно при роботі з двійковими числами з плаваючою точкою. Загальне правило, яке слід пам'ятати, полягає в тому, що більшість дробових чисел, які мають кінцеве представлення в десятковій (іменована "base-10"), не мають кінцевого представлення у двійковому (так званий "base-2"). І тому вони апроксимуються з використанням найближчого двійкового числа, доступного. Це наближення, як правило, дуже близьке, але воно буде трохи вимкнено, а в деяких випадках може призвести до того, що ваші результати трохи відрізнятимуться від очікуваних.

(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 вважають, що будь-яка програма, яка потребує повної підтримки Юнікод, можливо, вже має необхідні таблиці та функції, і тому SQLite не повинен займати простір, щоб дублювати цю здатність.

Замість того, щоб забезпечити повну підтримку Unicode за замовчуванням, SQLite надає можливість зв'язуватися з зовнішніми Unicode порівняннями і перетвореннями. Програма може перевантажити вбудовану систему NOCASE послідовність зіставлення (за допомогою sqlite3_create_collation () ) і вбудований люблю() , верхній () , і нижній () функції (використання sqlite3_create_function () ). Вихідний код SQLite містить розширення "ICU", яке виконує ці перевантаження. Або ж розробники можуть писати свої власні перевантаження на основі власних процедур порівняння Unicode, які вже містяться в їх проекті.

(19) INSERT дуже повільний - я можу робити лише кілька десятків INSERTs в секунду

Насправді, SQLite легко виконає 50 000 або більше INSERT висловлювань в секунду на середньому настільному комп'ютері. Але це буде лише кілька десятків транзакцій в секунду. Швидкість транзакції обмежена швидкістю обертання диска. Транзакція зазвичай вимагає двох повних обертів диска, що на диску 7200RPM обмежує приблизно 60 транзакцій в секунду.

Швидкість транзакції обмежена швидкістю диска, тому що (за замовчуванням) SQLite дійсно чекає, поки дані дійсно надійно зберігаються на поверхні диска до завершення транзакції. Таким чином, якщо ви раптово втратите владу або якщо ваша ОС припиниться, ваші дані все ще будуть безпечними. Про деталі читайте далі atomic commit в SQLite. .

За замовчуванням кожен оператор INSERT є власною транзакцією. Але якщо ви оточуєте кілька INSERT операторів з BEGIN ... COMMIT потім всі вставки згруповані в одну транзакцію. Час, необхідний для здійснення транзакції, амортизується по всіх вкладених операціях вставки, тому час операції на вставку значно зменшується.

Інший варіант - запустити PRAGMA синхронний = OFF . Ця команда призведе до того, що SQLite не чекає на дані, щоб досягти поверхні диска, що зробить операції запису більш швидкими. Але якщо ви втратите владу в середині транзакції, файл бази даних може пошкодитись.

(20) Я випадково видалив деякі важливі відомості з бази даних SQLite. Як я можу його відновити?

Якщо у вас є резервна копія файлу бази даних, відновіть інформацію з резервної копії.

Якщо у вас немає резервної копії, відновлення дуже важко. Можливо, ви зможете знайти часткові дані рядка у двійковому дампах файлу необробленої бази даних. Відновлення числових даних також може бути можливим за допомогою спеціальних інструментів, хоча, на нашу думку, таких інструментів немає. SQLite іноді компілюється з SQLITE_SECURE_DELETE опція, яка перезаписує весь видалений вміст нулями. Якщо це так, то відновлення явно неможливе. Відновлення також неможливе, якщо ви запустили ВАКУУМ після видалення даних. Якщо SQLITE_SECURE_DELETE не використовується, а VACUUM не запускається, то деякі видалені дані все одно можуть знаходитися в файлі бази даних, в областях, позначених для повторного використання. Але, знову ж таки, не існує ніяких процедур або інструментів, які ми знаємо, щоб допомогти вам відновити ці дані.

(21) Що таке помилка SQLITE_CORRUPT? Що це означає, що база даних буде "неправильно сформована"? Чому я отримую цю помилку?

An 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.

The SQLITE_OMIT _... Параметри часу компіляції працюють тільки при побудові з канонічних вихідних файлів. Вони не працюють при побудові з SQLite об'єднання або з попередньо оброблених вихідних файлів.

Можна побудувати спеціальний об'єднання який буде працювати з заздалегідь визначеним набором параметрів SQLITE_OMIT _.... Інструкції для цього можна знайти у вікні Документація SQLITE_OMIT _... .

(24) Мій вираз выраження WHERE column1 = "column1" не працює. Це призводить до повернення кожного рядка таблиці, а не тільки до рядків, у яких стовпець1 має значення "column1".

Використовуйте одиночні лапки, а не подвійні лапки, навколо строкових літералів в SQL. Це те, що вимагає стандарт SQL. У вашому виразі пропозиції WHERE слід читати: column1 = 'column1'

SQL використовує подвійні лапки навколо ідентифікаторів (назви стовпців або таблиць), які містять спеціальні символи або ключові слова. Отже, подвійні лапки є способом уникнення імен ідентифікаторів. Отже, коли ви говорите, column1 = "column1", що еквівалентно column1 = column1, що, очевидно, завжди вірно.

(25) Як генеруються синтаксичні діаграми (так звані "залізничні" діаграми) для SQLite?

Процес пояснюється на http://wiki.tcl-lang.org/21708 .

(26) Стандарт SQL вимагає, щоб обмеження UNIQUE виконувалося, навіть якщо один або більше стовпців у обмеженні NULL, але SQLite цього не робить. Хіба це не помилка?

Можливо, ви звертаєтеся до наступної операції з SQL92: Унікальне обмеження задовольняється тоді і тільки тоді, коли два рядки в таблиці не мають однакових ненульових значень у унікальних стовпцях. Ця заява неоднозначна, має принаймні дві можливі інтерпретації:

  1. Унікальне обмеження задовольняється тоді і тільки тоді, коли два рядки в таблиці не мають однакових значень і мають ненульові значення в унікальних стовпцях.
  2. Унікальне обмеження виконується тоді і тільки тоді, коли два рядки в таблиці не мають однакових значень у підмножині унікальних стовпців, які не є нульовими.

SQLite слідує інтерпретації (1), як і PostgreSQL, MySQL, Oracle і Firebird. Це правда, що Informix і Microsoft SQL Server використовують інтерпретацію (2), проте розробники SQLite вважають, що інтерпретація (1) є найбільш природним читанням вимоги, і ми також хочемо максимізувати сумісність з іншими двигунами баз даних SQL, а більшість інших Двигуни бази даних також йдуть з (1), так що SQLite робить.

(27) Що таке Класифікаційний номер експортного контролю (ECCN) для SQLite?

Після ретельного перегляду Списку Комерційного Контролю (CCL), ми переконані, що основний загальнодоступний вихідний код SQLite домену не описується будь-яким ECCN, тому ECCN має бути повідомлено як EAR99 .

Вищезгадане справедливо для ядра SQLite з відкритим доменом. Якщо ви розширюєте SQLite, додаючи новий код, або якщо статично з'єднаєте SQLite з вашим додатком, це може змінити ECCN у вашому конкретному випадку.

(28) Мій запит не повертає назви стовпців, які я очікую. Це помилка?

Якщо стовпці набору результатів називаються пунктами AS, то SQLite гарантовано використовуватиме ідентифікатор праворуч від ключового слова AS як ім'я стовпця. Якщо набір результатів не використовує пункт AS, SQLite може вільно називати колонку всім, що вона хоче. Див sqlite3_column_name () документацію для отримання додаткової інформації.

Як створити поле AUTOINCREMENT?
Які типи даних підтримують SQLite?
К первинний ключ на двох різних рядках однієї таблиці?
Чи можуть декілька програм або декілька екземплярів одного й того самого додатка одночасно отримати доступ до одного файлу бази даних?
Чи є SQLite нитки безпечним?
Який максимальний розмір VARCHAR в SQLite?
Чи підтримує SQLite тип BLOB?
Це помилка?
Чи можна використовувати SQLite у своєму комерційному продукті без сплати роялті?
Як я можу використовувати строковий літерал, що містить вбудований символ з однією цитатою?

Новости