Подтвердить что ты не робот

Разница между INT PRIMARY KEY и INTEGER PRIMARY KEY SQLite

Есть ли разница между INT PRIMARY KEY и INTEGER PRIMARY KEY при определении схемы для таблицы? Когда используется первичный ключ int, я получил созданную sqlite_autoindex вещь; когда целочисленный первичный ключ, я получил таблицу sqlite_sequence. какая разница? какие побочные эффекты могут иметь первый и второй варианты?

4b9b3361

Ответ 1

Все объяснено в Документация SQLite 3:

2.0 Главный ключ INTEGER

Единственное исключение для беспристрастности SQLite - это столбец, тип которого является INTEGER PRIMARY KEY. (И вы должны использовать "INTEGER", а не "INT". Столбец типа INT PRIMARY KEY является безличным, как и любой другой.) Столбцы INTEGER PRIMARY KEY должны содержать 32-разрядное целое число со знаком. Любая попытка вставить нецелые данные приведет к ошибке.

Столбцы INTEGER PRIMARY KEY могут использоваться для реализации эквивалента AUTOINCREMENT. Если вы попытаетесь вставить NULL в столбец INTEGER PRIMARY KEY, столбец будет фактически заполнен целым числом, которое на один больше, чем самый большой ключ, уже присутствующий в таблице. Или, если самый большой ключ - 2147483647, тогда столбец будет заполнен случайным целым числом. В любом случае столбцу INTEGER PRIMARY KEY будет присвоено уникальное целое число. Вы можете получить это целое число с помощью функции API sqlite_last_insert_rowid() или используя функцию last_insert_rowid() SQL в следующем операторе SELECT.

Ответ 2

Да, есть разница: INTEGER - это особый случай в SQLite, когда база данных не создает отдельный первичный ключ, а вместо этого использует столбцы ROWID. Когда вы используете INT (или любой другой тип, который "сопоставляет" с INTEGER внутри), создается отдельный первичный ключ.

Вот почему вы видите sqlite_autoindex, созданный для первичного ключа INT, и индекс не создан для одного из типов INTEGER: SQLite повторно использует встроенную структуру индексирования для целочисленного первичного ключа, рендеринга autoindex нет необходимости.

Вот почему первичный ключ INTEGER более экономичен как с точки зрения хранения, так и с точки зрения производительности.

Подробнее см. эту ссылку.

Ответ 3

Просто добавим, хотя и подразумеваемый уже на ответы здесь. Созданный вами столбец INTEGER PRIMARY KEY является просто псевдонимом для ROWID или _ROWID_ или OID. И если добавлено ключевое слово AUTOINCREMENT, то каждая новая вставленная запись является приращением 1 из последнего ROWID, а последний ROWID хранится внутренней таблицей sqlite с именем sqlite_sequence.

Смотрите ссылку здесь и здесь

С другой стороны, если вы объявляете столбец как INT PRIMARY KEY sqlite, создайте автоматический индекс (следовательно, sqlite_autoindex), чтобы отслеживать значение, вставленное в первичный ключ, чтобы убедиться, что оно уникально.