UPDATE e INSERT MYSQL?

Post Reply
FiveWiDi
Posts: 1238
Joined: Mon Oct 10, 2005 2:38 pm
Has thanked: 3 times
Been thanked: 4 times

UPDATE e INSERT MYSQL?

Post 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,
Un Saludo
Carlos G.

FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
User avatar
cmsoft
Posts: 1297
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina
Been thanked: 2 times

Re: UPDATE e INSERT MYSQL?

Post 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


if oServer:Query("select * from tutabla where tucondicion"):nRecCount > 0
   oServer:Execute("UPDATE ...")
   else
   oServer:Execute("INSERT ...")
endif
 
xmanuel
Posts: 768
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla
Been thanked: 5 times
Contact:

Re: UPDATE e INSERT MYSQL?

Post by xmanuel »

Code: Select all | Expand

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: 768
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla
Been thanked: 5 times
Contact:

Re: UPDATE e INSERT MYSQL?

Post 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

SELECT count( * ) FTROM tutabla WHERE tucondicion


La propuesta moderna es usar TRY/CATCH asi

Code: Select all | Expand


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
User avatar
cmsoft
Posts: 1297
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina
Been thanked: 2 times

Re: UPDATE e INSERT MYSQL?

Post by cmsoft »

Muchisimas gracias por tu sugerencia, no la conocía.
xmanuel
Posts: 768
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla
Been thanked: 5 times
Contact:

Re: UPDATE e INSERT MYSQL?

Post by xmanuel »

Espero que le valga a Carlos también!!!
______________________________________________________________________________
Sevilla - Andalucía
FiveWiDi
Posts: 1238
Joined: Mon Oct 10, 2005 2:38 pm
Has thanked: 3 times
Been thanked: 4 times

Re: UPDATE e INSERT MYSQL?

Post by FiveWiDi »

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

Re: UPDATE e INSERT MYSQL?

Post 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

SELECT count( * ) FTROM tutabla WHERE tucondicion


La propuesta moderna es usar TRY/CATCH asi

Code: Select all | Expand


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

Re: UPDATE e INSERT MYSQL?

Post 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

SELECT count( * ) FTROM tutabla WHERE tucondicion


La propuesta moderna es usar TRY/CATCH asi

Code: Select all | Expand


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
User avatar
cmsoft
Posts: 1297
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina
Been thanked: 2 times

Re: UPDATE e INSERT MYSQL?

Post 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

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.
Post Reply