SQLite позволит вам использовать любое поле в вашей таблице как PRIMARY KEY
. Это неявно создаст индекс UNIQUE
на поле. Тогда это поле, которое вы, как разработчик, можете считать основным уникальным идентификатором поля. Это может быть любой поддерживаемый тип данных SQLite (ниже).
SQLite всегда будет создавать неявный внутренний числовой идентификатор для каждой таблицы. Он будет иметь несколько псевдонимов, включая RowID
, OID
и _ROWID_
. Если вы создадите свой первичный ключ как INTEGER PRIMARY KEY
, он будет использовать то же поле, что и первичный ключ, и внутренний числовой идентификатор SQLite.
SQLite не имеет понятия типа данных Int32 или Int64 или Guid. Он имеет только четыре типа данных: INT
, REAL
, TEXT
и BLOB
. Когда вы запускаете DDL для SQLite, если вы используете что-то кроме этих четырех идентификаторов, SQLite будет использовать набор правил, чтобы определить, какой тип использовать. По сути, Int32
и Int64
обрабатываются как псевдонимы INT
и в итоге делают одно и то же.
Даже после того, как вы создали таблицы с типами данных, которые вы указали для каждого поля, все, что вы устанавливаете, - это сходство типов для этого поля. SQLite не поддерживает типы данных. Любые данные могут быть помещены в любое поле независимо от объявленного типа. SQLite будет использовать сходство типов для преобразования данных, если это возможно, поэтому, если вы вставите '123' в виде текстовой строки в поле INT
, оно сохранит его как число 123.
Единственное исключение для соответствия типов - INTEGER PRIMARY KEY
FIELDS. Это должны быть целые числа.
Целые числа в SQLite всегда хранятся с полем переменной длины. Таким образом, в зависимости от размера целого числа, вы можете вернуть Int32 для некоторых строк и Int64 для других, все в одном и том же поле. Это зависит от используемой вами оболочки, в данном случае от NHibernate (я думаю, с System.Data.SQLite).