Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Insertar o modificar dependiendo de una condición (https://www.clubdelphi.com/foros/showthread.php?t=61203)

noob 29-10-2008 21:36:54

Insertar o modificar dependiendo de una condición
 
Me gustaría saber si se puede hacer esto.

Digamos que tengo una tabla Tabla1 con dos campos: Codigo y Cantidad y tengo los siguientes registros:

+--+--+
|1 |23|
|2 |12|
+--+--+


ahora sumo seis unidades a la cantidad del registro cuyo codigo es dos:

Código:

update Tabla1 set Cantidad = Cantidad + 6 where Codigo = 2;
+--+--+
|1 |23|
|2 |18|
+--+--+


pero si ese registro no existiera, por ejemplo:

+--+--+
|1 |23|
|3 |12|
+--+--+


y hago:

Código:

update Tabla1 set Cantidad = Cantidad + 6 where Codigo = 2;
me daría error. Lo que debería de hacer sería:

Código:

insert into Tabla1 values (2, 6);
Yo quiero generar una sentencia genérica que me sirva tanto si existe ese registro como si no. Algo así como:

Código:

if existe registro then
  update Tabla1 set Cantidad = Cantidad + 6 where Codigo = 2
else
  insert into Tabla1 values (2, 6);

Quiero saber si todo esto se puede hacer bajo código MySQL sin ayudarnos de código Delphi claro.

¿Es posible?

jhonny 29-10-2008 21:54:34

Con Firebird se puede hacer utiizando la sentencia "Update or Insert", no conozco muy bien MySQL, por lo que solo podria decirte que tal vez tambien tenga dicha sentencia.

rgstuamigo 29-10-2008 23:00:56

Claro que se puede:

Código SQL [-]
DELIMITER $$

DROP PROCEDURE IF EXISTS `MIBaseDeDatos`.`Insertar` $$
CREATE PROCEDURE `MIBaseDeDatos`.`Insertar` (cod int,cant int)
BEGIN
   if exists(select Cod from Tabla1 t where t.Cod=cod)then
         update Tabla1 t set Cantidad = Cantidad + cant where t.Cod =cod;
      else
           insert into Tabla1 values (cod, cant);
    end if;
END $$

DELIMITER ;

noob 29-10-2008 23:02:18

¡Mil gracias!

noob 03-11-2008 01:25:13

Si creo el procedimiento me funciona pero yo quiero prescindir de crear un procedimiento. Hago esto pero me dice que hay un error de sintaxis:

Código SQL [-]
if exists (select * from Tabla1 t where t.Cod=2) then
  update Tabla1 t set Cantidad = 3 where t.Cod = 2;
else
  insert into Tabla1 t values (2, 3);
end if;

¿No es posible usar una sentencia IF THEN ELSE fuera de una subrutina?

Lepe 03-11-2008 12:30:08

No sé si en los componentes que usas tienes uno llamado Script. Viene a funcionar igual que el Script window de IBExpert.

Saludos

noob 03-11-2008 15:16:48

Hablo de MySQL, de momento sin tener nada que ver con Delphi, sólo digo que me da error de sintaxis al usar un IF THEN ELSE si no es dentro de un procedure o function.

Lo quiero para hacer un insert o update dependiendo de si el registro ya existe o no.

noob 03-11-2008 15:21:11

Al final he conseguido esto pero mediante una sentencia llamada replace:

Código SQL [-]
replace into Tabla1 values (2, 3);

REPLACE funciona exactamente como INSERT, excepto que si una fila antigua tiene el mismo valor para la clave primaria que una nueva entonces la fila antigua es borrada después de que la nueva fila sea insertada.


La franja horaria es GMT +2. Ahora son las 16:18:44.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi