Таблицы с ROWID
1.0 Определение
«Таблица с ROWID» — это любая таблица в схеме SQLite, которая
- не является виртуальной таблицей, и
- не является таблицей WITHOUT ROWID.
Таблицы с ROWID отличаются тем, что у них есть уникальный, не NULL, знаковый 64-битный целочисленный rowid, используемый в качестве ключа доступа к данным в базовом хранилище B-дерева.
2.0 Особенности
PRIMARY KEY таблицы с ROWID (если он есть) обычно не является истинным первичным ключом таблицы в том смысле, что это не уникальный ключ, используемый базовым хранилищем B-дерева. Исключением из этого правила является случай, когда таблица с ROWID объявляет INTEGER PRIMARY KEY. В исключительном случае INTEGER PRIMARY KEY становится псевдонимом для rowid.
Истинным первичным ключом для таблицы с ROWID (значением, используемым для поиска строк в базовом хранилище B-дерева) является rowid.
Ограничение PRIMARY KEY для таблицы с ROWID (пока это не истинный первичный ключ или INTEGER PRIMARY KEY) на самом деле является тем же, что и ограничение UNIQUE. Поскольку это не истинный первичный ключ, столбцы PRIMARY KEY могут принимать значение NULL, что противоречит всем стандартам SQL.
rowid таблицы с ROWID можно получить (или изменить), читая или записывая в любой из столбцов "rowid", "oid" или "_rowid_". За исключением случаев, если в таблице есть объявленные столбцы с этими специальными именами, то эти имена относятся к объявленным столбцам, а не к базовому rowid.
Доступ к записям через rowid высоко оптимизирован и очень быстрый.
Если rowid не имеет псевдонима INTEGER PRIMARY KEY, то он не сохраняется и может изменяться. В частности, команда VACUUM изменит rowid для таблиц, которые не объявляют INTEGER PRIMARY KEY. Поэтому приложения обычно не должны обращаться к rowid напрямую, а вместо этого должны использовать INTEGER PRIMARY KEY.
В базовом формате файла каждый rowid хранится как целое число переменной длины. Это означает, что небольшие неотрицательные значения rowid занимают меньше места на диске, чем большие или отрицательные значения rowid.
Все вышеперечисленные сложности (и другие, не упомянутые здесь) возникают из-за необходимости сохранения обратной совместимости для сотен миллиардов файлов баз данных SQLite, находящихся в обращении. В идеальном мире не должно быть такого понятия, как «rowid», и все таблицы должны следовать стандартной семантике, реализованной как таблицы WITHOUT ROWID, только без дополнительных слов «WITHOUT ROWID». К сожалению, жизнь сложна. Разработчик SQLite приносит свои искренние извинения за текущий беспорядок.
Эта страница была последняя обновлена 08.01.2022 05:02:57 UTC
SQLite is in the Public Domain.
https://sqlite.org/rowidtable.html