UPDATE e INSERT MYSQL?
UPDATE e INSERT MYSQL?
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,
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
Carlos G.
FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
- 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?
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
-
- Posts: 768
- Joined: Sun Jun 15, 2008 7:47 pm
- Location: Sevilla
- Been thanked: 5 times
- Contact:
Re: UPDATE e INSERT MYSQL?
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
Sevilla - Andalucía
-
- Posts: 768
- Joined: Sun Jun 15, 2008 7:47 pm
- Location: Sevilla
- Been thanked: 5 times
- Contact:
Re: UPDATE e INSERT MYSQL?
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
La propuesta moderna es usar TRY/CATCH asi
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.
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
Sevilla - Andalucía
- cmsoft
- Posts: 1297
- Joined: Wed Nov 16, 2005 9:14 pm
- Location: Mercedes - Bs As. Argentina
- Been thanked: 2 times
-
- Posts: 768
- Joined: Sun Jun 15, 2008 7:47 pm
- Location: Sevilla
- Been thanked: 5 times
- Contact:
Re: UPDATE e INSERT MYSQL?
Espero que le valga a Carlos también!!!
______________________________________________________________________________
Sevilla - Andalucía
Sevilla - Andalucía
Re: UPDATE e INSERT MYSQL?
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
Carlos G.
FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
-
- Posts: 18
- Joined: Mon Jan 13, 2014 8:37 pm
Re: UPDATE e INSERT MYSQL?
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 sentenciaCode: Select all | Expand
SELECT count( * ) FTROM tutabla WHERE tucondicion
La propuesta moderna es usar TRY/CATCH asiCode: 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?
Re: UPDATE e INSERT MYSQL?
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 sentenciaCode: Select all | Expand
SELECT count( * ) FTROM tutabla WHERE tucondicion
La propuesta moderna es usar TRY/CATCH asiCode: 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
- 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?
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
Eso se podría armar en un solo oServer:Execute y tendríamos la solución.
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.
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.