MySQL TRÊN CẬP NHẬT KHÓA DUPLICATE cho nhiều hàng chèn vào một truy vấn


199

Tôi có một truy vấn SQL nơi tôi muốn chèn nhiều hàng trong một truy vấn duy nhất. vì vậy tôi đã sử dụng một cái gì đó như:

$sql = "INSERT INTO beautiful (name, age)
  VALUES
  ('Helen', 24),
  ('Katrina', 21),
  ('Samia', 22),
  ('Hui Ling', 25),
  ('Yumie', 29)";

mysql_query( $sql, $conn );

Vấn đề là khi tôi thực hiện truy vấn này, tôi muốn kiểm tra xem một UNIQUEkhóa (không phải là khóa PRIMARY KEY), ví dụ như 'name'ở trên, có nên được kiểm tra không và nếu như vậy'name' đã tồn tại, toàn bộ hàng tương ứng phải được cập nhật nếu không.

Chẳng hạn, trong ví dụ dưới đây, nếu 'Katrina'đã có trong cơ sở dữ liệu, toàn bộ hàng, không phân biệt số lượng trường, cần được cập nhật. Một lần nữa nếu'Samia' không có mặt, hàng nên được chèn.

Tôi nghĩ về việc sử dụng:

INSERT INTO beautiful (name, age)
      VALUES
      ('Helen', 24),
      ('Katrina', 21),
      ('Samia', 22),
      ('Hui Ling', 25),
      ('Yumie', 29) ON DUPLICATE KEY UPDATE

Đây là cái bẫy. Tôi đã bị mắc kẹt và bối rối về cách tiến hành. Tôi có nhiều hàng để chèn / cập nhật cùng một lúc. Xin vui lòng cho tôi một hướng. Cảm ơn.

Câu trả lời:


479

Sử dụng từ khóa VALUESđể tham khảo các giá trị mới (xem tài liệu ).

INSERT INTO beautiful (name, age)
    VALUES
    ('Helen', 24),
    ('Katrina', 21),
    ('Samia', 22),
    ('Hui Ling', 25),
    ('Yumie', 29)
ON DUPLICATE KEY UPDATE
    age = VALUES(age),
     ...

2
Điều gì xảy ra nếu chúng ta cần bao gồm một câu lệnh IF trong CẬP NHẬT có một điều kiện khác nhau cho mỗi hàng?
logic

2
@logic: Có một số câu hỏi liên quan đến vấn đề này: Tìm kiếm StackOverflow . Nếu không ai trong số họ trả lời câu hỏi của bạn, xin vui lòng gửi một câu hỏi mới giải thích chính xác những gì bạn cần.
Peter Lang

@logic bạn tìm thấy giải pháp nào cho vấn đề của mình? hiện tại tôi đang đối mặt với cùng một vấn đề
Parth kharecha

Đề nghị tuyệt vời. Nếu bạn muốn tăng một giá trị khi nhân đôi, hãy thêm giá trị này sau phần "CẬP NHẬT KHÓA NGAY LẬP TỨC": tổng = tổng + GIÁ TRỊ (tổng cộng)
phượng hoàng

1

XÁC NHẬN VÀO ... TRÊN CẬP NHẬT KHÓA NGHIÊM TRỌNG sẽ chỉ hoạt động cho MYSQL, không phải cho SQL Server.

đối với máy chủ SQL, cách để giải quyết vấn đề này trước tiên là khai báo bảng tạm thời, chèn giá trị vào bảng tạm thời đó và sau đó sử dụng MERGE

Như thế này:

declare @Source table
(
name varchar(30),
age decimal(23,0)
)

insert into @Source VALUES
('Helen', 24),
('Katrina', 21),
('Samia', 22),
('Hui Ling', 25),
('Yumie', 29);


MERGE beautiful  AS Tg
using  @source as Sc
on tg.namet=sc.name 

when matched then update 
set tg.age=sc.age

when not matched then 
insert (name, age) VALUES
(SC.name, sc.age);

15
Ai sử dụng máy chủ SQL mặc dù: D
Jeremy Belolo

-3

Bạn có thể sử dụng Thay thế thay vì XÁC NHẬN ... TRÊN CẬP NHẬT TỪ KHÓA.


28
Có nhưng sử dụng REPLACE hàng cũ sẽ bị xóa trước khi hàng mới được chèn. Tôi muốn giữ lại hàng cũ để duy trì id chính.
Prashant

2
Tôi đã không nhận ra rằng việc giữ lại PK cũ là điều quan trọng đối với bạn ... Chắc chắn, REPLACE sẽ không hoạt động trong trường hợp này ...
a1ex07

4
PS: "thay thế thành" yêu cầu cả đặc quyền xóa và chèn!
Oliver M Grech

2
và đối với các lý do xóa / chèn được đề cập ở trên, nó cũng chậm hơn nhiều trong các trường hợp này.
Ross

1
Nếu bạn muốn cập nhật vài cột thì sao? Thay thế sẽ cập nhật tất cả.
imVJ
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.