Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

[SOLUCIONADO]  Como borrar o renombrar columna con otra columna autoincremental en SQLite
#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";
    ¡Gracias!
#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.
[-] Los siguientes 1 usuarios dice gracias a omoreno por este post:
  • gambafeliz
    ¡Gracias!
#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?
    ¡Gracias!
#4

https://www.gambas-it.org/smf/index.php?...4#msg51684

"Los horizontes perdidos nunca regresan. " (F. Battiato, La stagione dell'amore, 1983)

"Las ondas nunca regresan. " (Genesis: Ripples - A trick of the tail, 1976)
[-] Los siguientes 1 usuarios dice gracias a vuott por este post:
  • gambafeliz
    ¡Gracias!
#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.
    ¡Gracias!
#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.
    ¡Gracias!
#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.
    ¡Gracias!
#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.
[-] Los siguientes 1 usuarios dice gracias a omoreno por este post:
  • gambafeliz
    ¡Gracias!


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje
Último mensaje por omoreno
11-03-2022, 16:17
Último mensaje por Shordi
18-09-2021, 18:10
Último mensaje por Shell
18-09-2021, 14:41

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)