Замена sqlite.net bigint целым числом для ограничения первичного ключа автоинкремента

Мы используем sqlite для нашего мобильного проекта, однако, когда мы пытаемся использовать переменные с длинным идентификатором в качестве автоинкремента первичного ключа, код выдает ошибку «Autoincrement is only allowed in integer primary key». Когда я проверил в Интернете об этой ошибке, я обнаружил, что автоинкремент в sqlite не разрешен для типов bigint.

Интересно то, что bigint также реализуется целым числом — sqlite не имеет типа bigint — он просто использует размер целого числа, чтобы решить, является ли оно bigint или нет. http://www.sqlite.org/datatype3.html

Чтобы это исправить - я заменил открытый исходный код, где он создает таблицу с "bigint" на "integer", и написал некоторый тестовый код, чтобы убедиться, что он работает вне границ обычного целого числа (добавлен элемент с идентификатором больше, чем целое число). диапазон намеренно и постоянно добавлял еще 10 объектов).

Кажется, сейчас это работает, но я хочу знать, может ли это вызвать какие-то другие проблемы. Мы синхронизируем идентификаторы мобильных приложений с нашими идентификаторами базы данных, и поэтому у нас определенно будут идентификаторы, превышающие нормальный целочисленный диапазон.

Является ли это решение допустимым решением? К каким неприятностям это может привести?


person user3141326    schedule 07.06.2014    source источник


Ответы (1)


Из типов данных в версии SQLite:

Если объявленный тип содержит строку "INT", ему присваивается привязка INTEGER.

Однако это не означает, что столбец с родством INTEGER подходит для автоинкремента! Особый случай явно показан в ROWID и INTEGER PRIMARY KEY:

.. Столбец PRIMARY KEY становится целочисленным первичным ключом только в том случае, если объявленное имя типа точно "INTEGER". Другие имена целочисленного типа, такие как "INT" или "BIGINT" или "SHORT INTEGER" или "UNSIGNED INTEGER" заставляет столбец первичного ключа вести себя как обычный столбец таблицы с целочисленным сродством и уникальным индексом, а не как псевдоним для идентификатора строки.

Максимальный размер значения INTEGER в SQLite составляет 8 байт (64 бита, дополнение до двух со знаком) и, таким образом, четко сопоставляется со значением long в .NET (или Java); не имеет значения, был ли столбец объявлен как «INTEGER», что должно быть для столбца с автоматическим приращением, или как «BIGINT». (Фактический тип — на значение, а не на столбец; однако все значения автоинкремента/ROWID будут целыми числами.)

Кроме того, SQLite автоматически имеет «идентификатор записи/строки», даже без явного создания такого столбца — это столбец «ROWID», доступ к которому можно получить как ROWID, _ROWID_ или OID, если он не затенен. См. Автоинкремент SQLite, если это подходящий вариант, поскольку он изменяет алгоритм и удаляет некоторые монотонно возрастающие гарантии. :

Это важные свойства в некоторых приложениях. Но если вашему приложению не нужны эти свойства, вам, вероятно, следует оставить поведение по умолчанию, поскольку использование АВТОИНКРЕМЕНТА требует дополнительной работы.

person user2864740    schedule 07.06.2014
comment
Я понимаю вашу точку зрения, но я спрашиваю, есть ли какие-либо недостатки при использовании длинных переменных для целочисленного столбца sqlite с использованием sqlite.net. - person user3141326; 07.06.2014
comment
@user3141326 user3141326 Я расширил ответ. В любом случае нет проблем с отображением целочисленного поля (включая столбец с автоинкрементом) в SQLite в 64-битное целое число со знаком (т.е. длинное, System.Int64). - person user2864740; 07.06.2014