Si existe, actualice, inserte


14

Estoy tratando de crear un STORED PROCEDUREque se utilizará para UPDATEuna tabla llamada machine. Esta tabla tiene tres columnas ( machine_id, machine_namey reg_id).

En la tabla mencionada anteriormente, reg_id( INT) es una columna cuyos valores se pueden cambiar para a machine_id.

Me gustaría definir un QUERY/ PROCEDUREpara verificar si reg_idya existe en esa tabla. Si lo hace, entonces UPDATEesa fila, de lo contrario, INSERTuna nueva fila.

¿Puede alguien ayudarme a escribir eso QUERY/ PROCEDURE?

Respuestas:


12

Espero que esto ayude, DUPLICATE KEY UPDATE

create table machine(
  machine_id int not null primary key,
  machine_name varchar(50),
  reg_id int
);

insert into machine (machine_id, machine_name, reg_id)
values(1, 'my_machine', 1);

INSERT INTO machine (reg_id, machine_id, machine_name) VALUES (1, 1, 'test_machine')
  ON DUPLICATE KEY UPDATE machine_name=VALUES(machine_name);

Trabajar en SQL Fiddle


Es posible reg_id = VALUES(reg_id)que también lo necesiten .
— ypercubeᵀᴹ

¿Qué pasa si tenemos dos condiciones en la consulta, es decir, no solo la clave es única?
— Sam

11

El único problema es que no puede usarlo como una consulta normal. Las estructuras de control como IF o WHILE solo se permiten en procedimientos o funciones almacenados.

Simplemente cree un procedimiento como este:

delimiter $$
create procedure select_or_insert()
begin
  IF EXISTS (select * from users where username = 'something') THEN
    update users set id= 'some' where username = 'something';
  ELSE 
    insert into users (username) values ('something');
  END IF;
end $$
delimiter ;

y llámalo así:

call select_or_insert();

y hecho


1
Hola @Taz, ¿puedes marcar la respuesta que recibiste?
— Craig Efrein

@ Craig Efrein hola. Fui con el primero. Respuesta tuya. Gracias de nuevo.
— Taz

@Taz Me alegra que esta información sea útil, por favor, si esta respuesta puede eliminar sus dudas, proceda a cerrar la pregunta.
— Bill N. Varelli
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.