Nếu tồn tại thì cập nhật khác chèn


14

Tôi đang cố gắng tạo một STORED PROCEDUREcái sẽ được sử dụng cho UPDATEmột bảng được gọi machine. Bảng này có ba cột ( machine_id, machine_namereg_id).

Trong bảng đã nói ở trên, reg_id( INT) là một cột có các giá trị có thể được thay đổi cho a machine_id.

Tôi muốn xác định a QUERY/ PROCEDUREđể kiểm tra nếu một reg_idđã tồn tại trong bảng đó. Nếu có, thì UPDATEhàng đó, nếu không thì INSERTmột hàng mới.

Ai đó có thể vui lòng giúp tôi viết điều đó QUERY/ PROCEDURE?

Câu trả lời:


12

Hy vọng điều này sẽ giúp, cập nhật chính

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

Làm việc trên SQL Fiddle


Họ có thể cần reg_id = VALUES(reg_id)là tốt.
ypercubeᵀᴹ

Điều gì xảy ra nếu chúng ta có hai điều kiện truy vấn, ý tôi là không chỉ khóa là duy nhất?
Sam

11

Vấn đề duy nhất là, bạn không thể sử dụng nó như một truy vấn bình thường. Các cấu trúc điều khiển như IF hoặc WHILE chỉ được phép trong các thủ tục hoặc hàm được lưu trữ.

Chỉ cần tạo một thủ tục như thế này:

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 ;

và gọi nó như thế này:

call select_or_insert();

và thực hiện


1
Xin chào @Taz, bạn có thể kiểm tra câu trả lời bạn đã đi không?
Craig Efrein

@Craig Efrein hi. tôi đã đi với cái đầu tiên Trả lời của bạn. Cảm ơn một lần nữa.
Taz

@Taz Tôi rất vui vì thông tin này hữu ích, vui lòng nếu câu trả lời này có thể xóa bỏ nghi ngờ của bạn tiến hành đóng câu hỏi.
Bill N. Varelli
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.