Page 1 of 1

UPDATE e INSERT MYSQL?

PostPosted: Sun Dec 19, 2021 5:20 pm
by FiveWiDi
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,

Re: UPDATE e INSERT MYSQL?

PostPosted: Sun Dec 19, 2021 10:32 pm
by cmsoft
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
 

Re: UPDATE e INSERT MYSQL?

PostPosted: Mon Dec 20, 2021 10:03 am
by xmanuel
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;

Re: UPDATE e INSERT MYSQL?

PostPosted: Mon Dec 20, 2021 10:16 am
by xmanuel
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.

Re: UPDATE e INSERT MYSQL?

PostPosted: Mon Dec 20, 2021 11:33 am
by cmsoft
Muchisimas gracias por tu sugerencia, no la conocía.

Re: UPDATE e INSERT MYSQL?

PostPosted: Mon Dec 20, 2021 6:34 pm
by xmanuel
Espero que le valga a Carlos también!!!

Re: UPDATE e INSERT MYSQL?

PostPosted: Mon Dec 20, 2021 8:15 pm
by FiveWiDi
xmanuel wrote:Espero que le valga a Carlos también!!!


Por supuesto que me sirve.

Muchas gracias a ambos.

Re: UPDATE e INSERT MYSQL?

PostPosted: Wed Dec 29, 2021 8:55 pm
by Francisco Valério
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?

Re: UPDATE e INSERT MYSQL?

PostPosted: Thu Dec 30, 2021 8:36 am
by hmpaquito
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

Re: UPDATE e INSERT MYSQL?

PostPosted: Thu Dec 30, 2021 12:04 pm
by cmsoft
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.