PDA

Ver la Versión Completa : Insertar o modificar dependiendo de una condición


noob
29-10-2008, 21:36:54
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:

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:

update Tabla1 set Cantidad = Cantidad + 6 where Codigo = 2;

me daría error. Lo que debería de hacer sería:

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:


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:

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:

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:

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.