Creé una tabla en Sqlite usando la CREATE TABLE AS
sintaxis para crear una tabla basada en una SELECT
declaración. Ahora bien, esta tabla no tiene una clave principal, pero me gustaría agregar una.
La ejecución ALTER TABLE table_name ADD PRIMARY KEY(col1, col2,...)
da un error de sintaxis "cerca de PRIMARY"
¿Hay alguna forma de agregar una clave principal durante la creación de la tabla o después en Sqlite?
Por "durante la creación" me refiero durante la creación con CREATE TABLE AS
.
Respuestas:
No puede modificar las tablas SQLite de manera significativa después de que se hayan creado. La solución sugerida aceptada es crear una nueva tabla con los requisitos correctos y copiar sus datos en ella, luego eliminar la tabla anterior.
aquí está la documentación oficial sobre esto: http://sqlite.org/faq.html#q11
fuente
CREATE UNIQUE INDEX pkName ON tableName(columnName)
) cuando los marcos de base de datos como el SMO de MS SQL realmente le hacen agregar un PK después de que se haya creado la tabla.Siempre que esté usando
CREATE TABLE
, si está creando la clave principal en un solo campo , puede usar:Con
CREATE TABLE
, siempre puede utilizar el siguiente enfoque para crear una clave principal en uno o varios campos :Referencia: http://www.sqlite.org/lang_createtable.html
Esta respuesta no aborda la alteración de la tabla.
fuente
Intenté agregar la clave principal después cambiando la tabla sqlite_master directamente. Este truco parece funcionar. Es una solución de pirateo, por supuesto.
En resumen: cree un índice regular (único) en la tabla, luego haga que el esquema se pueda escribir y cambie el nombre del índice al formulario reservado por sqlite para identificar un índice de clave primaria, (es decir, sqlite_autoindex_XXX_1, donde XXX es el nombre de la tabla) y establezca la cadena sql en NULL. Por último, cambie la definición de la tabla en sí. One pittfal: sqlite no ve el cambio de nombre del índice hasta que se vuelve a abrir la base de datos. Esto parece un error, pero no grave (incluso sin volver a abrir la base de datos, puede seguir utilizándola).
Suponga que la tabla se ve así:
Luego hice lo siguiente:
Algunas pruebas (en shell sqlite):
fuente
Según los documentos de sqlite sobre la creación de tablas, el uso de la tabla de creación como selección produce una nueva tabla sin restricciones y sin clave principal.
Sin embargo, la documentación también dice que las claves primarias y los índices únicos son lógicamente equivalentes ( consulte la sección de restricciones ):
Por lo tanto, incluso si no puede modificar la definición de su tabla a través de la sintaxis de modificación de SQL, puede obtener el mismo efecto de clave primaria mediante el uso de un índice único.
Además, cualquier tabla (excepto aquellas creadas sin la sintaxis de rowid) tiene una columna de entero interna conocida como "rowid". De acuerdo con los documentos, puede usar esta columna interna para recuperar / modificar tablas de registros.
fuente
Puedes hacerlo así:
fuente
Introducción
Esto se basa en Java de Android y es un buen ejemplo de cómo cambiar la base de datos sin molestar a los fanáticos / clientes de la aplicación. Esto se basa en la idea de la página de preguntas frecuentes de SQLite http://sqlite.org/faq.html#q11
El problema
No me di cuenta de que necesitaba establecer un número de fila o id_registro para eliminar un solo artículo comprado en un recibo y, al mismo tiempo, el número de código de barras del artículo me engañó para que pensara en hacerlo como la clave para eliminar ese artículo. Estoy guardando los detalles de un recibo en la tabla recibo_barco Dejarlo sin un record_id puede significar eliminar todos los registros del mismo artículo en un recibo si utilicé el código de barras del artículo como clave.
aviso
Por favor, comprenda que esta es una copia y pegado de mi código en el que estoy trabajando al momento de escribir este artículo. Úselo solo como ejemplo, copiar y pegar al azar no lo ayudará. Modifique esto primero a sus necesidades
Además, no olvide leer los comentarios en el código.
El código
Use esto como un método en su clase para verificar primero si falta la columna que desea agregar. Hacemos esto solo para no repetir el proceso de alteración de la tabla Receive_barcode. Solo menciónalo como parte de tu clase. En el siguiente paso, verá cómo lo usaremos.
Luego, el siguiente código se usa para crear la tabla Receta_barcode si ya NO sale por primera vez para los usuarios de su aplicación. Y observe el "SI NO EXISTE" en el código. Tiene importancia.
fuente
Tuve el mismo problema y la mejor solución que encontré es crear primero la tabla que define la clave primaria y luego usar insertar en la declaración.
fuente
Usé la sintaxis CREATE TABLE AS para fusionar varias columnas y encontré el mismo problema. Aquí hay un AppleScript que escribí para acelerar el proceso.
fuente
Creo que agregar un índice en esa columna puede tener prácticamente el mismo efecto.
fuente
fuente
Use una herramienta como DB Browser para SQLite, permite agregar PK, AI simplemente haciendo clic derecho en la tabla -> modificar.
fuente