Spec-Zone.ru › SQLite

Таблицы с ROWID

1.0 Определение

«Таблица с ROWID» — это любая таблица в схеме SQLite, которая

  • не является виртуальной таблицей, и
  • не является таблицей WITHOUT ROWID.
Большинство таблиц в типичной схеме базы данных SQLite являются таблицами с 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API