UPDATE e INSERT MYSQL?

UPDATE e INSERT MYSQL?

Postby FiveWiDi » Sun Dec 19, 2021 5: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 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
FiveWiDi
 
Posts: 1060
Joined: Mon Oct 10, 2005 2:38 pm

Re: UPDATE e INSERT MYSQL?

Postby cmsoft » 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: Select all  Expand view

if oServer:Query("select * from tutabla where tucondicion"):nRecCount > 0
   oServer:Execute("UPDATE ...")
   else
   oServer:Execute("INSERT ...")
endif
 
User avatar
cmsoft
 
Posts: 1189
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: UPDATE e INSERT MYSQL?

Postby xmanuel » Mon Dec 20, 2021 10:03 am

Code: Select all  Expand view
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
xmanuel
 
Posts: 756
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla

Re: UPDATE e INSERT MYSQL?

Postby xmanuel » 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: Select all  Expand view
SELECT count( * ) FTROM tutabla WHERE tucondicion


La propuesta moderna es usar TRY/CATCH asi

Code: Select all  Expand view

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
xmanuel
 
Posts: 756
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla

Re: UPDATE e INSERT MYSQL?

Postby cmsoft » Mon Dec 20, 2021 11:33 am

Muchisimas gracias por tu sugerencia, no la conocía.
User avatar
cmsoft
 
Posts: 1189
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: UPDATE e INSERT MYSQL?

Postby xmanuel » Mon Dec 20, 2021 6:34 pm

Espero que le valga a Carlos también!!!
______________________________________________________________________________
Sevilla - Andalucía
xmanuel
 
Posts: 756
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla

Re: UPDATE e INSERT MYSQL?

Postby FiveWiDi » Mon Dec 20, 2021 8: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 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
FiveWiDi
 
Posts: 1060
Joined: Mon Oct 10, 2005 2:38 pm

Re: UPDATE e INSERT MYSQL?

Postby Francisco Valério » Wed Dec 29, 2021 8: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: Select all  Expand view
SELECT count( * ) FTROM tutabla WHERE tucondicion


La propuesta moderna es usar TRY/CATCH asi

Code: Select all  Expand view

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?
Francisco Valério
 
Posts: 18
Joined: Mon Jan 13, 2014 8:37 pm

Re: UPDATE e INSERT MYSQL?

Postby hmpaquito » Thu Dec 30, 2021 8: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: Select all  Expand view
SELECT count( * ) FTROM tutabla WHERE tucondicion


La propuesta moderna es usar TRY/CATCH asi

Code: Select all  Expand view

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
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: UPDATE e INSERT MYSQL?

Postby cmsoft » 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: Select all  Expand view
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.
User avatar
cmsoft
 
Posts: 1189
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 35 guests