Diferencia entre INT PRIMARY KEY e INTEGER PRIMARY KEY SQLite

¿Hay alguna diferencia entre INT PRIMARY KEY e INTEGER PRIMARY KEY cuando se define un esquema para una tabla? Cuando se utiliza la key primaria int, sqlite_autoindex cosa generada; cuando la key primaria entera, obtuve la tabla sqlite_sequence generada. ¿cual es la diferencia? ¿Qué efectos secundarios pueden tener la primera y la segunda variantes?

Todo se explica en la documentation de SQLite 3 :

2.0 La CLAVE PRIMARIA INTEGER

Una exception al sin tipo de SQLite es una columna cuyo tipo es INTEGER PRIMARY KEY. (Y debe usar "INTEGER" no "INT". Una columna de tipo INT PRIMARY KEY es tipográfica como cualquier otra.) Las columnas INTEGER PRIMARY KEY deben contener un integer con signo de 32 bits. Cualquier bash de insert datos no integers dará como resultado un error.

Las columnas INTEGER PRIMARY KEY se pueden usar para implementar el equivalente de AUTOINCREMENT. Si intenta insert un NULL en una columna INTEGER PRIMARY KEY, la columna se llenará con un integer que es uno mayor que la key más grande que ya se encuentra en la tabla. O si la key más grande es 2147483647, la columna se rellenará con un integer aleatorio. De cualquier manera, a la columna INTEGER PRIMARY KEY se le asignará un número integer único. Puede recuperar este número integer utilizando la function de API sqlite_last_insert_rowid () o utilizando la function SQL last_insert_rowid () en una statement SELECT posterior.

Sí, hay una diferencia: INTEGER es un caso especial en SQLite, cuando la database no crea una key primaria separada, sino que reutiliza la columna ROWID . Cuando usa INT (o cualquier otro tipo que "maps" para INTEGER internamente) se crea una key primaria separada.

Es por eso que ve sqlite_autoindex creado para la key principal INT , y no se creó ningún índice para el de tipo INTEGER : SQLite reutiliza una estructura de indexing incorporada para la key primaria entera, lo que hace innecesario el autoindex.

Es por eso que la key principal INTEGER es más económica, tanto en términos de almacenamiento como en términos de performance.

Vea este enlace para más detalles .

Solo para agregar aunque implícito ya en las respuestas aquí. La columna INTEGER PRIMARY KEY que ha creado es simplemente un alias para ROWID o _ROWID_ u OID . Y si se AUTOINCREMENT palabra key AUTOINCREMENT , cada nuevo logging insertado será un incremento de 1 del último ROWID y el último ROWID se mantendrá en una tabla interna sqlite denominada sqlite_sequence .

Ver enlace aquí y aquí

Por otro lado, si declara una columna como INT PRIMARY KEY sqlite, cree un índice automático (de ahí el sqlite_autoindex ) para realizar un seguimiento del valor insertado en la key principal para asegurarse de que sea único.