Un sentencia SQL multiple que se me resiste

n1x3r

Buenas noches, hace tiempo que no me pongo a esto y estoy un poco oxidado, a ver si me podéis echar una mano, grandes mentes pensantes.

Tengo que insertar varias series de datos:
ID, NOMBRE, PESO, EDAD
01,FULANIT0, 50, 20
02,MENGANITO, 80, 34
03,PEPITO, 120, 8
...

La cuestión esta en que tengo que insertar varios registros como los 3 mostrados anteriormente mediante una sola consulta SQL, pero si alguno de ellos existen con el mismo ID en vez de insertar tenemos que actualizar, y para rizar aun mas el rizo si fuese posible que cada vez que se inserte un nuevo registro, o el peso o la edad cambien insertar en otra tabla (Alertas por ejemplo) una alerta para saber que o se ha insertado un nuevo registro, o se ha actualizado la edad o el peso.

Todo esto desde una misma sentencia SQL.

Principalmente me conformaría simplemente con poder insertar esos 3 registros en la tabla, y si ya existe la ID actualizarlos, pero en una sola consulta.

Creo que los tiros van usando la sentencia ON DUPLICATE KEY

INSERT INTO tabla_gordos (id,nombre,peso,edad) 
  VALUES 
     (1,"FULANIT0",50,20), 
     (2,"MENGANITO", 80, 34),
     (03,"PEPITO", 120, 8)
  ON DUPLICATE KEY UPDATE 
     peso=VALUES(peso), 
     edad=VALUES(edad) ;

Un saludo y muchas gracias por adelanteado!

ExTiNcT_

Creo que la mejor opción sería que te hagas un PLSQL.

2 1 respuesta
Zerokkk

Como dice #2, mejor hazte un PLSQL con inserciones indexadas por un for y ya está, lo ejecutas y listo!

babri

pero solo en sql? eso con php vas pillando dato1 miras si está en base de datos y si esta update y si no insert, dije php por ponerte un ejemplo vaya

1 respuesta
Beavis

el batch insert es bastante sencillo con una consulta simple

INSERT INTO tabla (id,nombre,peso,edad) VALUES (1,'foo',50,20), (2,'bar',80,34) ON DUPLICATE KEY UPDATE peso = VALUES(peso), ...

lo de las alertas... no sé, lo podrías hacer con un trigger si tiene que ser todo con una única consulta

1 1 respuesta
n1x3r

#4 Correcto, es en php/MySQL pero lo que no quiero es hacer 30 consultas, prefiero simplificarlo todo en una.

1 respuesta
babri

#6 pues el amo y señor te ha respondido en #5

1 respuesta
n1x3r

#7 Como puedes ver eso ya lo tenia en mente, lo muestro en #1 buscaba algo lo mas optimizado posible, y sobre todo lo del trigger para las alertas.

2 respuestas
babri

#8 mi nivel de plsql es tan normal que me gusta más el tema de controlar como te dije, de hecho haría una función con un return boolean en plan comprobarTabla y dependiendo de pues meto una sql u otra. Soy muy mecánico y simple :(

1 respuesta
charl1

#9 No es malo lo que comentas pero si es más trabajo, a veces con pensar un poco más te ahorras código, cargas, etc..

Una de las buenas prácticas es en primera instancia usar las sentencias sql y si así no se puede ya piensas desarrollar código.

14 días después
pdj

#8 Puuuuues para hacer eso, un trigger sería algo asi como:

Esto es para sqlserver, no se que usas...

USE TuBaseDeDatos;
GO
IF OBJECT_ID ('nombreDtuEsquema.nombretrigger','TR') IS NOT NULL
    DROP TRIGGER nombreDtuEsquema.nombretrigger;
GO
CREATE TRIGGER nombretrigger
ON nombreDtuEsquema.nombreDeTuTabla
AFTER UPDATE /* Puedes añadir el delete o el insert o lo que quieras */ 
AS
   /* Manda un mail */
   EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'El remitente (tu)',
        @recipients = 'Destinatario',
        @body = 'El cuerpo',
        @subject = 'El asunto!';
GO

o si lo prefieres para tema de respuesta puedes usar un RAISERROR tal que:

...
AFTER UPDATE /* Puedes añadir el delete o el insert o lo que quieras */ 
AS
 RAISERROR ('Se ha updateado un registro!', 16, 10);
GO

EDIT: Vale, mea culpa no habia leido que era insert en otra tabla jajajaa pues seria:

...
AFTER UPDATE
AS 
    INSERT INTO nombreDtuEsquema.nombreDeTuTabla2 VALUES (.....)
GO

Usuarios habituales

  • pdj
  • charl1
  • babri
  • n1x3r
  • Beavis
  • Zerokkk
  • ExTiNcT_