Comunidad Gambas-es
[SOLUCIONADO] Como borrar o renombrar columna con otra columna autoincremental en SQLite - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: Bases de Datos (https://gambas-es.org/forum-6.html)
+--- Tema: [SOLUCIONADO] Como borrar o renombrar columna con otra columna autoincremental en SQLite (/thread-870.html)



Como borrar o renombrar columna con otra columna autoincremental en SQLite - gambafeliz - 07-04-2022

Hola

Necesito hacer una de las dos cosas siguientes:

1. Borrar columna
2. Renombrar columna

El gran problema es que tengo una columna distinta a la que deseo borrar o renombrar que es primary key Autoincrement y además esta relacionada en otras tablas y para mas complicación existen filas eliminadas y por lo tanto existen elementos incrementados borrados (ejemplo: 1, 2, 3, elementos eliminados en el conteo,10, 11, 12...)

Yo tengo ideas para resolverlo pero deseo comprobar si alguien me puede dar una lección magistral. Gracias.

=== Solución ====================================

La solución la a aportado "vuott" y Gianluigi del foro de Italia.

Yo en particular he optado por cambiar el nombre de la columna y así no afecto a nada mas que a vistas. Este es el comando:

alter table nombreTabla Rename column "columnaAcambiarNombre" to "nombreNuevo";


RE: Como borrar o renombrar columna con otra columna autoincremental en SQLite - omoreno - 07-04-2022

Hola gambafeliz.

Tengo dos opciones, no es magistral, pero me funciona: 
Opción 1: La forma lenta:
 
Pasos:
  1. Ejecutas este comando para liberar los FK:
    PRAGMA foreign_keys = 0;

  2. Creas una tabla temporal para pasar los datos:
    CREATE TABLE temp_tabla AS SELECT * FROM original_tabla;

  3. Borras la tabla original:
    DROP TABLE original_tabla;

  4. Crear nuevamente la tabla original con el cambio de nombre a la columna:
    CREATE TABLE original_tabla (columnaX INTEGER PRIMARY KEY AUTOINCREMENT, …. resto de las columnas y restricciones)

  5. Insertas los datos de la tabla temporal en la original:
    INSERT INTO original_tabla (columnas...)
    SELECT columnas... FROM temp_tabla;
  1. Si la columna es FK en otras tablas tendrás que repetir los pasos anteriores por cada tabla en la que es FK, también tendrías que crear los TRIGGER si los tuvieras.

  2. Borras todas las tablas temporales.

  3. Finalmente activas los FK:
    PRAGMA foreign_keys = 1;
 
Todo lo puedes escribir en un solo Query
 
Opcion2: La forma rápida: Cool
 
Instala el programa SQLiteStudio desde https://sqlitestudio.pl/ y hará todo automático.
 
Saludos.


RE: Como borrar o renombrar columna con otra columna autoincremental en SQLite - gambafeliz - 07-04-2022

No lo he probado todavía pero me encanta tu propuesta.

Muchas gracias.

Nota: no estoy seguro pero primary key es distinto a clave foránea. ¿Estás de acuerdo o estoy equivocado?

Por lo tanto, si tengo razón, ¿es posible que falle tu propuesta?


RE: Como borrar o renombrar columna con otra columna autoincremental en SQLite - vuott - 07-04-2022

https://www.gambas-it.org/smf/index.php?topic=9164.msg51684#msg51684


RE: Como borrar o renombrar columna con otra columna autoincremental en SQLite - gambafeliz - 07-04-2022

Guau vuott

Eres la pera (magnífico)

Gracias en mayúsculas a ti y a Gianluigi

Observo que en el foro de Italia sois magníficos.

Estupenda comunidad la de Gambas. Lo voy a probar pero desde luego estás son las respuestas.


RE: Como borrar o renombrar columna con otra columna autoincremental en SQLite - Harpo - 07-04-2022

Yo el ALTER TABLE de SQLite lo trataría con respeto, y si no se tiene muy claro y sabes lo que modificas....
Estoy con Omoreno, yo uso  SQLiteStudio para esas cosas. Y lo que hace es generar un script para que veas qué modifica y asegurarse de que todo salga correcto.

He cambiado un campo TEXT a VARCHAR(100) y estos son los pasos a dar:

[Imagen: w39fyET.png]

Un saludo.


RE: Como borrar o renombrar columna con otra columna autoincremental en SQLite - gambafeliz - 07-04-2022

Gracias, Harpo no conocía el programa que me proponéis, pero sinceramente, me encanta escribir los comandos yo mismo, he incluso me gusta usar directamente la ayuda de SQLite pero desconocía los comandos de la propuesta de vuott, por que, sinceramente soy usuario novel en SQLite, pero no en bases de datos Oracles, MySQL, MariaDB... ni de Microsoft SQL. Como verás al final son todas muy similares, pero insisto, de SQLite ahora.


RE: Como borrar o renombrar columna con otra columna autoincremental en SQLite - omoreno - 08-04-2022

(07-04-2022, 13:57)gambafeliz escribió: Nota: no estoy seguro pero primary key es distinto a clave foránea. ¿Estás de acuerdo o estoy equivocado?

Por lo tanto, si tengo razón, ¿es posible que falle tu propuesta?

Hola gambafeliz.

Disculpa la demora en responder, estaba peleando con una conexión a Oracle... que casi me da un infarto... Sad.

Ciertamente PK no es igual a FK, pero si tu PK en esa tabla es FK en otra tabla, entonces al tratar de hacerle algún alter a la columna PK, SQLite se quejara de que es FK en otra tabla y no te dejara, por eso es que se ejecuta el comando para liberar momentáneamente los FK.

Nota: Como dice el colega Harpo, realizar esto de forma manual tiene alto riesgo, solamente lo hago de la forma que te comente arriba cuando tengo que actualizar las bases de datos remotas de dispositivos mobiles (Android), enviando el script completo con la actualización dentro del programa.

Saludos.