Se esiste, aggiorna altrimenti inserisci


14

Sto cercando di creare un STORED PROCEDUREche verrà utilizzato per UPDATEun tavolo chiamato machine. Questa tabella contiene tre colonne ( machine_id, machine_namee reg_id).

Nella tabella di cui sopra, reg_id( INT) è una colonna i cui valori possono essere modificati per a machine_id.

Vorrei definire un QUERY/ PROCEDUREper verificare se reg_idesiste già un in quella tabella. In tal caso, quindi UPDATEquella riga, altrimenti INSERTuna nuova riga.

Qualcuno può aiutarmi a scrivere quello QUERY/ PROCEDURE?

Risposte:


12

Spero che questo aiuti, 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);

Lavora su SQL Fiddle


Potrebbero anche aver bisogno reg_id = VALUES(reg_id).
ypercubeᵀᴹ

cosa succede se abbiamo due condizioni per la query, intendo che non solo la chiave è unica?
Sam,

11

L'unico problema è che non puoi usarlo come una normale query. Strutture di controllo come IF o WHILE sono consentite solo in stored procedure o funzioni.

Basta creare una procedura come questa:

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 ;

e chiamalo così:

call select_or_insert();

e fatto


1
Ciao @Taz, puoi dare un'occhiata alla risposta con cui sei andato?
Craig Efrein,

@Craig Efrein hi. sono andato con il primo. La tua risposta. Grazie ancora.
Taz,

@Taz Sono lieto che queste informazioni siano utili, per favore se questa risposta può rimuovere i tuoi dubbi procedere alla chiusura della domanda.
Bill N. Varelli,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.