RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Small. Fast. Reliable.
Choose any three.

Таблицы Rowid

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

"Таблица rowid" это любая таблица в схеме SQLite, которая:

Большинство таблиц в типичной схеме базы данных SQLite это таблицы rowid.

Таблицы Rowid отличает то, что у них всех есть уникальный, не-NULL, signed 64-bit integer rowid, который используется в качестве ключа доступа для данных в основном движке хранения B-tree.

2.0. Хитрости

  • PRIMARY KEY таблиц rowid (если есть) обычно является не истинным первичным ключом для таблицы в том смысле, что это не уникальный ключ, используемый основным движком хранения B-tree. Исключение из этого правила: когда таблица rowid объявлена как INTEGER PRIMARY KEY. В исключении INTEGER PRIMARY KEY становится псевдонимом для rowid.

  • Истинный первичный ключ для таблицы rowid (значение, которое используется в качестве ключа, чтобы искать строки в основном движке хранения B-tree) это 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 сохранен как variable-length integer. Это означает, что маленькие неотрицательные значения rowid занимают меньше дискового пространства, чем большие или отрицательные значения rowid.

  • Все осложнения выше (и другие, не упомянутые здесь), являются результатом потребности сохранить обратную совместимость для сотен из миллиардов файлов базы данных SQLite, находящихся в обращении. В прекрасном мире не было бы такой вещи, как "rowid" и все таблицы будут после стандартной семантики, осуществленной как таблицы WITHOUT ROWID, только без дополнительных ключевых слов "WITHOUT ROWID". К сожалению, жизнь грязна. Проектировщик SQLite приносит свои искренние извинения за текущий беспорядок.