Есть ли разница между INT PRIMARY KEY
и INTEGER PRIMARY KEY
при определении схемы для таблицы?
Когда используется первичный ключ int, я получил созданную sqlite_autoindex
вещь;
когда целочисленный первичный ключ, я получил таблицу sqlite_sequence
.
какая разница? какие побочные эффекты могут иметь первый и второй варианты?
Разница между INT PRIMARY KEY и INTEGER PRIMARY KEY SQLite
Ответ 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
), чтобы отслеживать значение, вставленное в первичный ключ, чтобы убедиться, что оно уникально.