primary not keys foreign ejemplo data create autoincrement activate android database sqlite primary-key rowid

android - not - ¿Usando el texto como clave principal en la tabla SQLite mal?



sqlite primary key autoincrement (4)

¿Es malo tener texto como clave principal en una base de datos SQLite? Escuché que es malo por razones de rendimiento, ¿es cierto? ¿Y se utilizará el rowid como la clave primaria real en tal caso?


¿Es malo tener texto como clave principal en una base de datos SQLite? Escuché que es malo por razones de rendimiento, ¿es cierto?

Desde el punto de vista de la corrección, la TEXT PRIMARY KEY está bien.

Desde el punto de vista del rendimiento, prefiera las teclas INTEGER . Pero al igual que con cualquier problema de rendimiento, mídalo usted mismo para ver si hay una diferencia significativa con sus datos y casos de uso.

¿Y se utilizará el rowid como la clave primaria real en tal caso?

Solo INTEGER PRIMARY KEY obtiene un alias con ROWID . Otros tipos de claves primarias no lo hacen, y habrá un rowid entero implícito a menos que se especifique WITHOUT ROWID . Reference .


¿Es malo tener texto como clave principal en una base de datos SQLite? Escuché que es malo por razones de rendimiento, ¿es cierto?

Nunca escuché que alguien usara una cadena como clave principal en la tabla. Para mí (y sinceramente espero también para otros) una práctica muy "fea" con un rendimiento muy bajo.

Si utilizará la cadena como clave principal, debe pensar en algunas "cosas":

  • ¿Será suficiente la combinación de 3 símbolos?
  • ¿O debería usar 5 símbolos?

Aquí, cada fila debe tener el mismo formato (problema de legibilidad, por supuesto) y también ser único . Oh! Aquí está el siguiente "trabajo cerdito" -> necesitarás crear un "generador de cadena único" que generará un identificador de cadena 1 único 2 .

Y también hay próximos temas que es bueno tener en cuenta:

  • Cuerdas más largas = automáticamente cada vez más difícil de comparar
  • El tamaño de la tabla aumenta radicalmente porque está bastante claro que la cadena tiene mucho más tamaño que el número
  • Número de filas: es una locura usar una cadena como clave principal si la tabla puede tener más de 1000 filas

Es un tema más complejo, pero me gustaría decir que está bien, para tablas muy pequeñas sería posible usar cadenas como clave principal (si tiene algún sentido), pero si observa desventajas, es una técnica mucho mejor para usar el número como Clave primaria seguro!

¿Y cuál es la conclusión?

No te recomiendo que uses cadena como clave principal. Tiene más desventajas como ventajas (¿tiene realmente alguna ventaja?).

El uso del número como clave principal es mucho más mejor (me da miedo decir lo mejor) en la práctica.

¿Y se utilizará el rowid como la clave primaria real en tal caso?

Si va a utilizar la cadena como principal no.

1 En cuerdas reales rara vez son únicos.

2 Por supuesto, podría decir que puede crear un identificador a partir del nombre del elemento en la fila, pero una vez más es un código spaghetti (los elementos pueden tener el mismo nombre).


En el mundo real, el uso de cadenas como clave principal tiene muchos beneficios si estamos hablando de UUID. Ser capaz de crear el "pasaporte" de la entidad exactamente en el momento de su creación puede simplificar enormemente el código asincrónico y / o el sistema distribuido (si estamos hablando de una arquitectura de cliente / servidor móvil más compleja).

En cuanto al rendimiento, no encontré ninguna diferencia medible al ejecutar un punto de referencia para realizar 10000 búsquedas de claves primarias, ya que, en realidad, los índices de la base de datos no almacenan ni comparan cadenas al ejecutar búsquedas indexadas.


Sí, si usa TEXT obtiene android.database.sqlite.SQLiteConstraintException: error de restricción UNIQUE: TableName.ColumnName (código 1555)

SQLite tiene una sesión para insertar y devolver el ID de fila de la última fila insertada, si esta inserción es exitosa. de lo contrario volverá -1.

el retorno se asigna a _ID, esta es la razón por la que te obligan a conectar BaseColumns para la tabla

es extraño que la llamada de inserción tenga que devolver el rowid, en lugar de un booleano o algo así

Me gustaría que la capacidad de TEXT PRIMARY KEY estuviera allí en sqlite