Rất nhiều nhà phát triển vẫn thực hiện truy vấn để kiểm tra xem một trường có nằm trong bảng không và sau đó thực thi truy vấn chèn hoặc cập nhật theo kết quả của truy vấn đầu tiên. Hãy thử sử dụng cú pháp NHẬT BẢN DU LỊCH, điều này nhanh hơn rất nhiều và tốt hơn sau đó thực hiện 2 truy vấn.Thông tin thêm có thể được tìm thấy here
INSERT INTO bảng (a, b, c) VALUES (4,5,6) ON DUPLICATE KEY CẬP NHẬT c = 9;
nếu bạn muốn giữ lại các giá trị tương tự cho c bạn có thể làm một bản cập nhật với giá trị tương tự
INSERT INTO bảng (a, b, c) VALUES (4,5,6) BẬT CẬP NHẬT CHÍNH C = 6;
sự khác biệt giữa 'thay thế' và 'trên khóa trùng lặp':
thay thế: chèn, hoặc xóa và chèn
trên khóa trùng lặp: chèn hoặc cập nhật
nếu bảng của bạn không có khóa chính hoặc khóa duy nhất, thay thế không có ý nghĩa gì.
Bạn cũng có thể sử dụng hàm VALUES
để tránh phải chỉ định giá trị thực hai lần. Ví dụ. thay vì
INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=6;
bạn có thể sử dụng
INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(c);
đâu VALUES(c)
sẽ đánh giá với giá trị quy định prevously (6).
Nó tạo nhiều hơn mục nhập cho người dùng REPLACE INTO SET ip = '$ uip', lastcheck = '$ tim' – unrelativity
IS IP hoặc lastcheck hoặc là khóa chính hoặc chỉ mục duy nhất? – carl
Sau đó, hành vi bạn đang trải qua được mong đợi. Một trường phải là chính hoặc duy nhất để làm việc này. Nếu không, làm cách nào MySQL biết để ngăn chặn các bản sao? Có vẻ như bạn nên có user_id trong bảng này (dưới dạng khóa chính) mà bạn cũng đặt trong thay thế của mình. – carl