Jeśli istnieje, to zaktualizuj inny insert


14

Próbuję utworzyć taki, STORED PROCEDUREktóry będzie przyzwyczajony do UPDATEtabeli o nazwie machine. Ta tabela ma trzy kolumny ( machine_id, machine_namei reg_id).

W powyższej tabeli reg_id( INT) jest kolumną, której wartości można zmienić dla machine_id.

Chciałbym zdefiniować QUERY/, PROCEDUREaby sprawdzić, czy reg_idjuż istnieje w tej tabeli. Jeśli tak, to UPDATEten wiersz, w przeciwnym razie INSERTnowy wiersz.

Czy ktoś może mi pomóc napisać to QUERY/ PROCEDURE?

Odpowiedzi:


12

Mam nadzieję, że to pomaga, 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);

Pracuj na SQL Fiddle


Mogą również potrzebować reg_id = VALUES(reg_id).
— ypercubeᵀᴹ

co jeśli mamy dwa warunki zapytania, to znaczy, że nie tylko klucz jest unikalny?
— Sam

11

Jedynym problemem jest to, że nie można go używać jak zwykłego zapytania. Struktury kontrolne, takie jak IF lub WHILE, są dozwolone tylko w procedurach przechowywanych lub funkcjach.

Po prostu utwórz następującą procedurę:

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 ;

i nazwij to tak:

call select_or_insert();

i zrobione


1
Witaj @Taz, czy możesz sprawdzić odpowiedź, z którą poszedłeś?
— Craig Efrein

@Craig Efrein cześć. poszedłem z pierwszym. Twoja odpowiedź. Dzięki jeszcze raz.
— Taz

@Taz Cieszę się, że te informacje są pomocne, jeśli ta odpowiedź może usunąć wątpliwości, przejdź do zamknięcia pytania.
— Bill N. Varelli
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.