Если существует, обновите еще вставить

14

Я пытаюсь создать, STORED PROCEDUREкоторый будет использоваться для UPDATEтаблицы с именем machine. Эта таблица состоит из трех столбцов ( machine_id, machine_nameи reg_id).

В вышеупомянутой таблице reg_id( INT) - это столбец, значения которого можно изменить для a machine_id.

Я хотел бы определить QUERY/, PROCEDUREчтобы проверить, существует ли reg_idуже в этой таблице. Если это так, то UPDATEэта строка, иначе INSERTновая строка.

Может кто-нибудь, пожалуйста, помогите мне написать это QUERY/ PROCEDURE?

Таз
источник

Ответы:

12

Надеюсь, что это помогает, ДУБЛИРОВАТЬ КЛЮЧ ОБНОВЛЕНИЕ

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);

Работа на SQL Fiddle

Крейг Эфрейн
источник
Они могут нуждаться reg_id = VALUES(reg_id)также.
ypercubeᵀᴹ
Что если у нас есть два условия для запроса, я имею в виду не только ключ уникален?
Сэм
11

Единственная проблема в том, что вы не можете использовать его как обычный запрос. Управляющие структуры, такие как IF или WHILE , разрешены только в хранимых процедурах или функциях.

Просто создайте процедуру, подобную этой:

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 ;

и назовите это так:

call select_or_insert();

и сделано

Билл Н. Варелли
источник
1
Здравствуйте @Taz, вы можете пометить ответ, с которым вы пошли?
Крейг Эфрейн,
@ Крейг Эфрейн привет. я пошел с первым. Ответ твой. Еще раз спасибо.
Таз
@Taz Я рад, что эта информация полезна, пожалуйста, если этот ответ может устранить ваши сомнения, продолжайте закрывать вопрос.
Билл Н. Варелли