2012-06-27 30 views
13

Tôi có một bảng (name, date, stat1, stat2, stat3), (name, date) là PK. Khi tôi chèn hàng, sẽ có các khóa trùng lặp và tôi cần tổng hợp ba số liệu thống kê. Tôi sử dụng truy vấn sau với PreparedStatement trong Java:Chèn hàng MySQL trên cập nhật khóa trùng lặp nhiều cột

INSERT INTO tb (name, date, stat1, stat2, stat3) 
VALUES (?, ?, ?, ?, ?) 
ON DUPLICATE KEY UPDATE stat1 = stat1 + ?, stat2 = stat2 + ?, stat3 = stat3 + ? 

Có truy vấn ngắn gọn hơn để đạt được điều đó không? Bởi vì tôi đã đơn giản hóa truy vấn, có hơn mười số liệu thống kê ở đó.

Trả lời

26
INSERT INTO tb (name, date, stat1, stat2, stat3) 
VALUES (?, ?, ?, ?, ?) 
ON DUPLICATE KEY UPDATE stat1 = stat1 + VALUES(stat1), stat2 = stat2 + VALUES(stat2), stat3 = stat3 + VALUES(stat3) 
+1

Tốt hơn. Nhưng liệu tôi có thể lặp lại mọi stat không? – DrXCheng

+1

Đáng buồn là không có cú pháp meta, chỉ có thể liệt kê – vearutop

+0

Tôi thấy đây là một câu hỏi cũ, nhưng một tùy chọn khác là viết một thủ tục với số liệu thống kê trong một chuỗi và sau đó lặp qua chúng (sau khi tách). Có thể không ít mã nhưng nó sẽ năng động hơn. – inarilo

0

Thêm cột được tính (tổng) và bao gồm cột đó trong PK của bạn.

Tuy nhiên, điều này làm không chuẩn hóa bảng của bạn. Bạn có thể sử dụng một phím thay thế và làm việc tính trong bạn CHỌN

-2

Nếu bạn chỉ định ON UPDATE KEY trùng lặp, và một hàng được chèn vào có thể gây ra một giá trị trùng lặp trong một chỉ số UNIQUE hoặc PRIMARY KEY, MySQL thực hiện một CẬP NHẬT hàng cũ. Ví dụ, nếu cột một được khai báo là UNIQUE và chứa giá trị 1, hai câu sau đây có tác dụng tương tự:

INSERT INTO bảng (a, b, c) VALUES (1,2,3) ON CẬP NHẬT CHÍNH DU LỊCH c = c + 1;

Truy vấn cập nhật tương đương là như dưới đây,

CẬP NHẬT bảng SET c = c + 1 WHERE a = 1;

Nếu a và cột b là duy nhất, tương đương với truy vấn cập nhật sẽ,

CẬP NHẬT bảng SET c = c + 1 WHERE a = 1 HOẶC b = 2 LIMIT 1;

+0

Bạn đã đăng cùng một câu trả lời [tại đây] (http://stackoverflow.com/questions/20672203/insert-or-if-column-combination-exists-update/20674595#20674595). Nếu bạn cảm thấy câu hỏi này tương tự, hãy gắn cờ câu hỏi đó dưới dạng bản sao thay thế. –

Các vấn đề liên quan