Почему вы не можете использовать SQLite ROWID в качестве первичного ключа? - PullRequest
12 голосов
/ 23 ноября 2011

Это не выполняется:

create table TestTable (name text, age integer, primary key (ROWID))

Сообщение об ошибке:

11-23 11: 05: 05.298: ОШИБКА / База данных (31335): ошибка 1 (таблица TestTable не имеет столбца с именем ROWID) в 0x2ab378 при подготовке 'создать таблицу TestTable (текст имени, возрастное целое число, первичный ключ (ROWID) ).

Однако после создания TestTable все готовится и выполняется очень хорошо:

create table TestTable (name text, age integer);

insert into TestTable (name, age) values ('Styler', 27);

select * from TestTable where ROWID=1;

Я потенциально мог бы видеть ROWID как решение необходимости первичного ключа с автоинкрементом и внешнего ключа, которые никогда не будут использоваться в качестве заполненных в качестве данных на прикладном уровне. Поскольку ROWID по умолчанию скрыто от select наборов результатов, было бы неплохо связать это с первичным ключом, сохраняя его скрытым от логики приложения. OracleBlog: ROWNUM и ROWID говорят, что это невозможно и нежелательно, но не дает большого объяснения, кроме этого.

Итак, поскольку ответ на вопрос «возможно ли это» определенно нет / нецелесообразен, вопрос более или менее «почему нет»?

1 Ответ

34 голосов
/ 23 ноября 2011

Сводка по SQLite.org:

В SQLite строки таблицы обычно имеют 64-разрядное целое число со знаком ROWID, которое является уникальным среди всех строк в одной таблице.(WITHOUT ROWID таблицы являются исключением.)

Если таблица содержит столбец типа INTEGER PRIMARY KEY, этот столбец становится псевдонимом для ROWID.Затем вы можете получить доступ к ROWID, используя любое из четырех разных имен, три исходных имени (ROWID, _ROWID_ или OID) или имя, присвоенное столбцу INTEGER PRIMARY KEY.Все эти имена являются псевдонимами друг для друга и одинаково хорошо работают в любом контексте.

Просто используйте его в качестве первичного ключа.

...