Системные таблицы SQLLite - PullRequest
0 голосов
/ 05 июня 2019

Я создал новую базу данных SQLLite через PHP-скрипт для быстрого MVP.

Сравнивая структуру базы данных с переданным мне файлом, я могу оценить отсутствие некоторых таблиц sys / *, отсутствующих в моей новой базе данных. Различия были замечены при использовании DB Browser для SQLLite

Я читал документацию по SQLLite, и кажется, что есть только одна таблица sys - sysmaster - которая может быть неявно запрошена.

Итак, мой вопрос: каковы эти другие таблицы, такие как sys / version или тому подобное? Они нужны? Они ссылаются на предыдущую версию SQLite (например, v2)?

Спасибо

1 Ответ

2 голосов
/ 05 июня 2019

При сравнении структуры базы данных с переданным мне файлом я могу оценить отсутствие некоторых таблиц sys / *, отсутствующих в моей новой базе данных.

sys таблицы не являются системными таблицами SQLite и, следовательно, являются таблицами, определяемыми пользователем.

Я читал документацию по SQLLite, и похоже, что существует только одна таблица sys - sysmaster, котораяможно неявно запрашивать.

Все системные таблицы SQLite начинаются с sqlite_

Единственное, что должно существовать, это sqlite_master , этосхема базы данных.

Другие могут существовать в соответствии с: -

sqlite_sequence будет существовать, если любая таблица содержит ключевое слово AUTOINCREMENT (которое ограничено использованием только для псевдонимастолбец rowid).

sqlite_statn (где n - это число 1-4) создаются при запуске ANALYZE.

  • stat2-4 зависятпосле опций компиляции,d обычно отсутствует после анализа.

sqlite_autoindex _ * ???создаются, когда используются ограничения UNIQUE и PRIMARY KEY, НО НЕ для псевдонима rowid

Все системные таблицы SQLite доступны неявно, все также доступны, а некоторые даже могут быть изменены (на свой страх и риск).

sqlite_master невозможно изменить, например, попытка запустить: -

INSERT INTO sqlite_master VALUES('table','ooops','ooops','CREATE TABLE ooops (COL1 TEXT)');

приводит к: -

INSERT INTO sqlite_master VALUES('table','ooops','ooops','CREATE TABLE ooops (COL1 TEXT)')
> table sqlite_master may not be modified
> Time: 0s

Возможно, рассмотрим следующее: -

DROP TABLE IF EXISTS mytable1;
CREATE TABLE IF NOT EXISTS mytable1 (
    id INTEGER PRIMARY KEY AUTOINCREMENT, -- autoincrement results in sqlite_sequence being created
    COL1 TEXT UNIQUE -- UNIQUE results in an sqlite_autoindex table being created
    );
ANALYZE; -- will result in sqlite_stat1 being created
SELECT * FROM sqlite_master; -- RESULT1
SELECT * FROM sqlite_stat1; -- RESULT2
SELECT * FROM sqlite_sequence; -- RESULT3
INSERT INTO mytable1 (COL1) VALUES ('A'),('B'),('C'); -- will result in sqlite_sequence being updated
SELECT * FROM sqlite_sequence; -- RESULT4
UPDATE sqlite_sequence SET seq = 100 WHERE name = 'mytable1'; -- naughty
INSERT INTO mytable1 (COL1) VALUES ('X'),('Y'),('Z');
SELECT * FROM sqlite_sequence; -- RESULT5
SELECT * FROM mytable1; -- RESULT6

Результаты запросов: -

Результат 1

enter image description here

т.е. таблицы Sqlite sqlite_stat1 , sqlite_sequence и sqlite_autoindex_mytable1_1 созданы.

Результат 2

enter image description here

т.е. sqlite_stat1 пусто (ничего для анализа)

Результат 3

enter image description here

т.е. sqlite_sequence пусто (в mytable1 не было вставлено ни одной строки)

Результат 4

После вставки 3 строки в mytable1 sqlite_sequence содержит строку для mytable1, значение seq равно 3 (последний вставленный идентификатор строки).

enter image description here

Результат 5

После обновления значения seq тоже 100 добавляются еще 3 строки в mytable1, номер seq увеличился до 103

enter image description here

Результат 6

и mytable имеет ожидаемые 6 строк, НО id (псевдоним столбца rowid) перепрыгнул после 3 к 100 (потому что sqlite_sequence был изменен): -

enter image description here

Итак, мой вопрос: каковы эти другие таблицы, такие как sys / version или тому подобное?Они нужны?Они ссылаются на предыдущую версию SQLite (например, v2)?

Надеюсь, что выше ответили больше всего.Но, возможно, в качестве резюме, позвольте SQLite управлять своими системными таблицами.Вы можете прочитать Формат файла базы данных - 2.6.1.Внутренние объекты схемы до раздела 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...