La sentencia “update or insert” nos sirve para insertar un registro en una tabla, pero que si este ya existe se actualice, vamos al grano, veamos su sintaxis y un ejemplo de esto:
SINTAXIS
UPDATE OR INSERT INTO <tabla o vista> [(<lista_columnas>)] VALUES (<lista_valores>) [MATCHING(<lista_columnas>)] [RETURNING < lista_columnas> [INTO <lista_variables>]]
Nota: RETURNING, lo explicaré en un artículo más adelante, es uno de los artículos que debo recuperar.
Un ejemplo básico, es el siguiente:
UPDATE OR INSERT INTO empleados (codigo, nombre, salario) VALUES(3, ‘JHONNY A. SUÁREZ’, 2000)
Suponiendo que en el ejemplo anterior el campo CODIGO sea la llave primaría, entonces Firebird buscará el registro con el código número 3 y si lo encuentra actualiza los datos, colocándole los valores ahí mencionados en la clausula llamada VALUES. Si no encuentra el registro con el código 3, insertará un registro nuevo con esos valores.
EJEMPLO “GRAFICO”
ANTES de ejecutar el ejemplo anterior, podría presentarse cualquiera de los 2 siguientes casos
| CODIGO | NOMBRE | VALOR |
| 1 | MANUELA SAENZ | 1350 |
| 2 | PANCRACIO DURAN | 1600 |
| 3 | JHONNY A. SUAREZ |
1500 |
| CODIGO | NOMBRE | VALOR |
| 1 | MANUELA SAENZ | 1350 |
| 2 | PANCRACIO DURAN | 1600 |
DESPUES de ejecutar el ejemplo anterior, en cualquiera de los dos casos, obtendremos el siguiente resultado
| CODIGO | NOMBRE | VALOR |
| 1 | MANUELA SAENZ | 1350 |
| 2 | PANCRACIO DURAN | 1600 |
| 3 | JHONNY A. SUAREZ | 2000 |
Un ejemplo más flexible, es el siguiente:
Suponiendo que código es un campo autoincremental y que además solo sabemos el NOMBRE del susodicho, al que le vamos a modificar su VALOR…
UPDATE OR INSERT INTO empleados (nombre, salario) VALUES( ‘JHONNY A. SUÁREZ’, 2000) MATCHING(nombre)
En este caso, estaremos obligando a Firebird, para que en lugar de buscar por el campo CODIGO, busque por el campo NOMBRE. En la clausula MATCHING podemos agregar cuantos campos sean necesarios, separados por coma.
Cuando en la clausula INTO no hemos incluido la llave primaría de la tabla, entonces se hace necesario incluir la clausula MATCHING, de lo contrario Firebird devolverá el error “UPDATE OR INSERT field list does not match primary key of table NOMBRE_TABLA”.
Como ven, es muy sencillo utilizar esta funcionalidad y nos ahorra bastante tiempo, haciendo que nuestra experiencia con FireBird sea mucho más divertida, de lo que ha sido hasta ahora.
A tener en cuenta
1) “Update or Insert”, no es parte del estándar SQL.
2) Si incluyes el Matching notaras que la búsqueda que hace FireBird es del tipo sensible a mayúsculas y minúsculas. Además es preferible que exista un índice sobre los campos indicados en esta clausula.
3) Se pueden especificar 2 o más campos en la clausula Matching, esto se hace separándolos por comas.
4) Al igual que con un simple INSERT, puedes omitir los valores de la clausula INTO, pero debes incluir en ella todos los campos, así: UPDATE OR INSERT INTO tabla VALUES (3,’JHONNY A. SUAREZ’, 2000);
Espero que este artículo les sea de utilidad y como siempre sus comentarios serán ¡¡¡Bienvenidos!!!
Hasta la próxima.
Posdata: Este articulo ha sido recuperado y modificado, del anterior blog.















Curioso
Sí, además es muy útil, se evita uno tener que hacer varios exists o algo así por el estilo, para determinar si un registro hay que insertarlo o actualizarlo.
Hola me gustaria saber como puedo hacer para actualizar mas de un registro a la vez, lo que quiero hacer es algo como asi
UPDATE SINVDEP
SET FT_EXISTENCIA = FT_EXISTENCIA - 53 WHERE FT_CODIGOPRODUCTO = ’012103′ AND FT_CODIGODEPOSITO = 8 ;
UPDATE SINVDEP
SET FT_EXISTENCIA = FT_EXISTENCIA - 53 WHERE FT_CODIGOPRODUCTO = ’012104′ AND FT_CODIGODEPOSITO = 8 ;
pero en una soloa sentencia no de uno
gracias si me puede alguine colaborar agradeceria demaciado
A ver, según veo FT_CODIGOPRODUCTO va en una secuencia que comienza desde el código 012103, en ese caso, simplemente tendría que hacer algo como:
SET FT_EXISTENCIA = FT_EXISTENCIA – 53 WHERE FT_CODIGOPRODUCTO >= ’012104′ AND FT_CODIGODEPOSITO = 8 ;
Si la cuestión es que son unos FT_CODIGOPRODUCTO especificos, puedes hacer uso de la clausula in, así:
UPDATE SINVDEP
SET FT_EXISTENCIA = FT_EXISTENCIA – 53 WHERE FT_CODIGOPRODUCTO in(’012103′, ’012104′, ’012120′) AND FT_CODIGODEPOSITO = 8 ;
Espero te haya podido ayudar y te sirva de algo la respuesta.