При сравнении структуры базы данных с переданным мне файлом я могу оценить отсутствие некоторых таблиц 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](https://i.stack.imgur.com/pk4ez.png)
т.е. таблицы Sqlite sqlite_stat1 , sqlite_sequence и sqlite_autoindex_mytable1_1 созданы.
Результат 2
![enter image description here](https://i.stack.imgur.com/X3Ts3.png)
т.е. sqlite_stat1 пусто (ничего для анализа)
Результат 3
![enter image description here](https://i.stack.imgur.com/v7oXt.png)
т.е. sqlite_sequence пусто (в mytable1 не было вставлено ни одной строки)
Результат 4
После вставки 3 строки в mytable1 sqlite_sequence содержит строку для mytable1, значение seq равно 3 (последний вставленный идентификатор строки).
![enter image description here](https://i.stack.imgur.com/lQe0i.png)
Результат 5
После обновления значения seq тоже 100 добавляются еще 3 строки в mytable1, номер seq увеличился до 103
![enter image description here](https://i.stack.imgur.com/tlRLv.png)
Результат 6
и mytable имеет ожидаемые 6 строк, НО id (псевдоним столбца rowid) перепрыгнул после 3 к 100 (потому что sqlite_sequence был изменен): -
![enter image description here](https://i.stack.imgur.com/3dX84.png)
Итак, мой вопрос: каковы эти другие таблицы, такие как sys / version или тому подобное?Они нужны?Они ссылаются на предыдущую версию SQLite (например, v2)?
Надеюсь, что выше ответили больше всего.Но, возможно, в качестве резюме, позвольте SQLite управлять своими системными таблицами.Вы можете прочитать Формат файла базы данных - 2.6.1.Внутренние объекты схемы до раздела 3.