Замена sqlite.net "bigint" на целое число для ограничения первичного ключа автоинкремента
Мы используем sqlite для нашего мобильного проекта - однако, когда мы пытаемся использовать переменные длинных идентификаторов в качестве автоинкремента первичного ключа - код выдает ошибку "Autoincrement is only allowed in integer primary key
Msgstr "Когда я проверил эту ошибку в Интернете, я обнаружил, что автоинкремент в sqlite не разрешен для bigint
типы.
Интересная вещь bigint
также реализуется целым числом - sqlite не имеет bigint
тип - он просто использует размер целого числа, чтобы решить, является ли он bigint
или нет. http://www.sqlite.org/datatype3.html
Чтобы это исправить - я заменил открытый исходный код, где он создает таблицу на "bigint
" с "integer
", и написал некоторый тестовый код, чтобы убедиться, что он работает за пределами обычного целого числа (намеренно добавил элемент с идентификатором, превышающим диапазон целого числа, и непрерывно добавил еще 10 объектов).
Кажется, что это работает сейчас - но я хочу знать, может ли это вызвать некоторые другие проблемы. Мы синхронизируем идентификаторы мобильных приложений с нашими идентификаторами базы данных, и поэтому у нас определенно будут идентификаторы, превышающие нормальный целочисленный диапазон.
Является ли это решение правильным решением? Какие проблемы это может вызвать?
1 ответ
Из типов данных в версии SQLite:
Если объявленный тип содержит строку "INT", ему присваивается сходство INTEGER.
Однако это не означает, что столбец со сходством INTEGER подходит для автоматического увеличения! Особый случай явно вытягивается в ROWID и INTEGER PRIMARY KEY:
.. Столбец PRIMARY KEY становится целочисленным первичным ключом только в том случае, если объявленное имя типа является точно "INTEGER". Другие имена целочисленных типов, такие как "INT" или "BIGINT" или "SHORT INTEGER" или "UNSIGNED INTEGER", заставляют столбец первичного ключа вести себя как обычный столбец таблицы с целочисленным сходством и уникальным индексом, а не как псевдоним для rowid.
Максимальный размер значения INTEGER в SQLite составляет 8 байт (64 бита, дополнение со знаком 2) и, таким образом, четко отображается на long
значение в.NET (или Java); не имеет значения, был ли столбец объявлен как "INTEGER", который должен быть для столбца с автоинкрементом или с "BIGINT". (Фактический тип указывается для каждого значения, а не для столбца; однако все значения с автоприращением /ROWID будут целыми числами.)
Кроме того, SQLite автоматически имеет "идентификатор записи / строки", даже без явного создания такого столбца - это столбец "ROWID", и к нему можно получить доступ как ROWID
, _ROWID_
, или же OID
если не в тени. Посмотрите Автоинкремент SQLite, если это подходящий вариант, так как он изменяет алгоритм и удаляет некоторые монотонно увеличивающиеся гарантии:
Это важные свойства в определенных приложениях. Но если вашему приложению не нужны эти свойства, вам, вероятно, следует придерживаться поведения по умолчанию, поскольку использование AUTOINCREMENT требует дополнительной работы.