A veces, necesitamos importar en nuestras tablas de Firebird el contenido existente en otras tablas, quizás .DBF, Access, Paradox, etc., en las cuales no teníamos definida una Primary Key.
Recuerda que en Firebird es súper recomendable que todas las tablas tengan su correspondiente Primary Key (la única excepción son las tablas que tienen una sola fila).
Entonces, luego de crear una tabla en Firebird e importar los datos desde la otra tabla procedemos a agregarle la Primary Key (si es que en el programa de importación ya no lo habíamos hecho) con un stored procedure similar al siguiente:
CREATE PROCEDURE AGREGAR_PRIMARYKEY AS DECLARE VARIABLE lnContador INTEGER; BEGIN FOR SELECT TAR_IDENTI FROM TARJETAS INTO lnContador DO BEGIN UPDATE TARJETAS SET TAR_IDENTI = ROW_COUNT + 1; END END;
La columna TAR_IDENTI de la tabla TARJETAS es numérica y su valor podría haber sido cero o NULL en todas las filas. Este stored procedure utiliza a la variable de contexto ROW_COUNT para conocer cual es el número de la fila que se está procesando en el FOR SELECT. Como el valor inicial de ROW_COUNT es cero se le tuvo que sumar uno para que la numeración empezara con 1.
ROW_COUNT es una variable de contexto que está disponible en los stored procedures, triggers y execute block y que nos informa la cantidad de filas que se obtuvieron con el último comando DML (INSERT, UPDATE, DELETE, o FETCH).
Cuando se usa a ROW_COUNT dentro de un FOR SELECT su valor es incrementado en cada iteración, empezando con cero.
Solamente después de ejecutar ese stored procedure con éxito podemos definir a la columna TAR_IDENTI como Primary Key, si lo hubiéramos intentado antes hubiéramos obtenido un error ya que la columna TAR_IDENTI tenía valores repetidos (un cero o un NULL en cada fila de la tabla) y en las Primary Key no pueden existir valores repetidos ni nulos.
Al finalizar el stored procedure y luego del COMMIT correspondiente nos aseguramos que la columna TAR_IDENTI no tiene valores repetidos por lo cual podemos proceder a definirla como Primary Key.
¿Cómo ejecutar este stored procedure?
Tienes 3 formas:
1. Mediante el programa ISQL.EXE que viene incluido con el Firebird:
(haciendo clic en la imagen la verás más grande)
2. Si usas el programa EMS SQL Manager, mediante la opción «Execute»
(haciendo clic en la imagen la verás más grande)
3. Si usas el programa EMS SQL Manager, también puedes usar el editor SQL
(haciendo clic en la imagen la verás más grande)
En estos dos últimos casos no te olvides de hacer clic sobre la opción COMMIT para que los cambios queden grabados permanentemente.
Francisco
Jun 03, 2013 @ 16:56:47
Que tal Walter, recien he pasado DBF al FB, en mi caso una vez que pase la información, el campo Id que es el Primary Key queda como null como dices.
Ejecutando un SCRIP como este :
UPDATE TABLA SET ID=GEN_ID(TABLA_ID_GEN,1)
Con esto se actualuzarón todas las filas con el ID generado por el mismo FB, lo que despues ya me permitio poner la columna ID como PK.
P.D.
tengo un utileria que descargue que te pasa toda una base de datos de VFP a FB, por si interesa.
Saludos.
wrov
Jun 03, 2013 @ 17:19:37
Sí, tienes razón esa es otra alternativa.
Y en verdad me interesa todo lo que esté relacionado con Firebird, así que te agradeceré que me envíes esa utilería.
Saludos.
Walter.
Francisco
Jun 03, 2013 @ 19:37:10
Eviado Walter, por favor me confirmas ya que no estoy seguro si manejas el mismo correo.
cerezocableado
Jun 04, 2013 @ 08:11:55
Hola,
Hay una muy buena herramienta para mover datos entre BDs:
http://fbexport.sourceforge.net/
En cuanto a la importación de datos de DBF y añadirle las IDs, creo que es francamente interesante incluir siempre un trigger a las tablas con IDs para que se asignen automáticamente, este nos vale tanto para el día a día como para la importación.
Francisco
Jun 04, 2013 @ 20:15:25
Interesante CerezoCableado . Gracias.
El índice del blog Firebird21 | Firebird SQL
Jun 17, 2013 @ 04:45:47