FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour UPDATE e INSERT MYSQL?
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
UPDATE e INSERT MYSQL?
Posted: Sun Dec 19, 2021 05:20 PM

Hola a todos,

Existe alguna manera para que si realizo un UPDATE, si éste no puede realizarse por no existir el registro a actualizar, se proceda de manera 'automática' a realizar un INSERT?

Gracias,

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: UPDATE e INSERT MYSQL?
Posted: Sun Dec 19, 2021 10:32 PM
Deberias hacer un select previo por la condicion del update y contar si trae registros, en caso afirmativo haces el update sino el insert
Code (fw): Select all Collapse
if oServer:Query("select * from tutabla where tucondicion"):nRecCount > 0
   oServer:Execute("UPDATE ...")
   else
   oServer:Execute("INSERT ...")
endif
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: UPDATE e INSERT MYSQL?
Posted: Mon Dec 20, 2021 10:03 AM
Code (fw): Select all Collapse
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=3;
INSERT INTO t1 (a,b,c) VALUES (4,5,6)
  ON DUPLICATE KEY UPDATE c=9;
______________________________________________________________________________

Sevilla - Andalucía
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: UPDATE e INSERT MYSQL?
Posted: Mon Dec 20, 2021 10:16 AM
Cesar la solucion que propones no es la mejor en sistemas modernos o que usaan el paradigma cliente/servidor sobre todo si es un sistema con una red lenta. Pero si hubiera que usar ese sistema es mejor la sentencia
Code (fw): Select all Collapse
SELECT count( * ) FTROM tutabla WHERE tucondicion


La propuesta moderna es usar TRY/CATCH asi

Code (fw): Select all Collapse
try
   oServer:Execute("UPDATE ...")
catch
   oServer:Execute("INSERT ...")
end


Se intenta el UPDATE y si no es posible el INSERT eso es compatible con cualquier base de datos.

Pero la más optima es la que propongo más arriba... (Solo compatible con MySQL y MariaDB)

En la medida de lo posible hay que evitar peticiones al servidor sobre todo si es lento.
______________________________________________________________________________

Sevilla - Andalucía
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: UPDATE e INSERT MYSQL?
Posted: Mon Dec 20, 2021 11:33 AM

Muchisimas gracias por tu sugerencia, no la conocía.

Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: UPDATE e INSERT MYSQL?
Posted: Mon Dec 20, 2021 06:34 PM

Espero que le valga a Carlos también!!!

______________________________________________________________________________

Sevilla - Andalucía
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: UPDATE e INSERT MYSQL?
Posted: Mon Dec 20, 2021 08:15 PM
xmanuel wrote:Espero que le valga a Carlos también!!!


Por supuesto que me sirve.

Muchas gracias a ambos.

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 18
Joined: Mon Jan 13, 2014 08:37 PM
Re: UPDATE e INSERT MYSQL?
Posted: Wed Dec 29, 2021 08:55 PM
xmanuel wrote:Cesar la solucion que propones no es la mejor en sistemas modernos o que usaan el paradigma cliente/servidor sobre todo si es un sistema con una red lenta. Pero si hubiera que usar ese sistema es mejor la sentencia
Code (fw): Select all Collapse
SELECT count( * ) FTROM tutabla WHERE tucondicion


La propuesta moderna es usar TRY/CATCH asi

Code (fw): Select all Collapse
try
   oServer:Execute("UPDATE ...")
catch
   oServer:Execute("INSERT ...")
end


Se intenta el UPDATE y si no es posible el INSERT eso es compatible con cualquier base de datos.

Pero la más optima es la que propongo más arriba... (Solo compatible con MySQL y MariaDB)

En la medida de lo posible hay que evitar peticiones al servidor sobre todo si es lento.


Una pregunta en esta sugerencia, si el error devuelto en la UPDATE TRY no se refiere a no tener el registro, sino a un error en la QUERY en sí, ¿insertará el registro que no estaba destinado a ser insertado o me equivoco?
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: UPDATE e INSERT MYSQL?
Posted: Thu Dec 30, 2021 08:36 AM
Francisco Valério wrote:
xmanuel wrote:Cesar la solucion que propones no es la mejor en sistemas modernos o que usaan el paradigma cliente/servidor sobre todo si es un sistema con una red lenta. Pero si hubiera que usar ese sistema es mejor la sentencia
Code (fw): Select all Collapse
SELECT count( * ) FTROM tutabla WHERE tucondicion


La propuesta moderna es usar TRY/CATCH asi

Code (fw): Select all Collapse
try
   oServer:Execute("UPDATE ...")
catch
   oServer:Execute("INSERT ...")
end


Se intenta el UPDATE y si no es posible el INSERT eso es compatible con cualquier base de datos.

Pero la más optima es la que propongo más arriba... (Solo compatible con MySQL y MariaDB)

En la medida de lo posible hay que evitar peticiones al servidor sobre todo si es lento.


Una pregunta en esta sugerencia, si el error devuelto en la UPDATE TRY no se refiere a no tener el registro, sino a un error en la QUERY en sí, ¿insertará el registro que no estaba destinado a ser insertado o me equivoco?



Muy buena la pregunta. Me parece a mi que la unica manera fiable 100%, sin ambiguaciones y compatible SQL es la que ha expuesto Cesar, aun a pesar de que no es optima, pero es lo que da de si el SQL standard
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: UPDATE e INSERT MYSQL?
Posted: Thu Dec 30, 2021 12:04 PM
Si, si la query del UPDATE fallara porque está mal escrita, iría a hacer el INSERT, pero, como estamos presuponiendo que preguntamos por la clave principal sin repetidos, la segunda opción también dará error porque la key ya existe.
Creo igual que vale también la instrucción que puso Manuel
Code (fw): Select all Collapse
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=3;
INSERT INTO t1 (a,b,c) VALUES (4,5,6)
  ON DUPLICATE KEY UPDATE c=9;

Eso se podría armar en un solo oServer:Execute y tendríamos la solución.
Cesar la solucion que propones no es la mejor en sistemas modernos o que usaan el paradigma cliente/servidor sobre todo si es un sistema con una red lenta.

Creo que en esto Manuel tiene mucha razón, y una buena técnica es intentar optimizar las querys para ganar tiempo de optimizar recursos.
Tal vez en un sistema de base de datos local, con no muchos usuarios simultáneos esto no se note demasiado, pero en bases de datos remotas y con mucha concurrencia esto puede marcar la diferencia de un sistema estable a un sistema lento.

Continue the discussion