Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-10-2008
noob noob is offline
Miembro
 
Registrado: sep 2008
Posts: 212
Poder: 16
noob Va por buen camino
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?

Última edición por noob fecha: 29-10-2008 a las 22:03:21.
Responder Con Cita
  #2  
Antiguo 29-10-2008
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
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.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #3  
Antiguo 29-10-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Thumbs up

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 ;
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 29-10-2008 a las 23:50:12.
Responder Con Cita
  #4  
Antiguo 29-10-2008
noob noob is offline
Miembro
 
Registrado: sep 2008
Posts: 212
Poder: 16
noob Va por buen camino
¡Mil gracias!
Responder Con Cita
  #5  
Antiguo 03-11-2008
noob noob is offline
Miembro
 
Registrado: sep 2008
Posts: 212
Poder: 16
noob Va por buen camino
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?

Última edición por noob fecha: 03-11-2008 a las 02:20:45.
Responder Con Cita
  #6  
Antiguo 03-11-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
No sé si en los componentes que usas tienes uno llamado Script. Viene a funcionar igual que el Script window de IBExpert.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 03-11-2008
noob noob is offline
Miembro
 
Registrado: sep 2008
Posts: 212
Poder: 16
noob Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 03-11-2008
noob noob is offline
Miembro
 
Registrado: sep 2008
Posts: 212
Poder: 16
noob Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Insertar y modificar al mismo tiempo ! hecospina Firebird e Interbase 4 17-09-2008 13:40:28
Insertar y/o modificar un campo con decimales rafita Varios 5 30-07-2007 10:41:28
Como insertar, eliminar y modificar en c#? danytorres .NET 2 09-05-2006 22:29:47
lentitud al Modificar/Insertar kukinn Conexión con bases de datos 3 23-03-2004 09:37:57
Problema el insertar/modificar registro ing_alsaac Conexión con bases de datos 0 29-02-2004 09:18:15


La franja horaria es GMT +2. Ahora son las 06:22:27.


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
Copyright 1996-2007 Club Delphi