gambafeliz   07-04-2022, 11:43
#1
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";
Última modificación: 07-04-2022, 20:13 por gambafeliz.
omoreno   07-04-2022, 12:56
#2
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.
gambafeliz   07-04-2022, 13:57
#3
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?
Última modificación: 07-04-2022, 14:02 por gambafeliz.
vuott   07-04-2022, 16:45
#4
https://www.gambas-it.org/smf/index.php?...4#msg51684

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
gambafeliz   07-04-2022, 17:11
#5
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.
Harpo   07-04-2022, 19:11
#6
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.
gambafeliz   07-04-2022, 19:55
#7
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.
omoreno   08-04-2022, 01:22
#8
(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.
Última modificación: 08-04-2022, 01:38 por omoreno.
  
Usuarios navegando en este tema: 1 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.