MySQL kiểm tra các bản sao trước khi chèn
CHÈN. ON DUPLICATE KEY UPDATE là một phần mở rộng MariaDB/MySQL cho câu lệnh INSERT, nếu nó tìm thấy một khóa chính hoặc khóa duy nhất trùng lặp, thay vào đó, nó sẽ thực hiện CẬP NHẬT Show Giá trị/các hàng bị ảnh hưởng được báo cáo là 1 nếu một hàng được chèn và 2 nếu một hàng được cập nhật, trừ khi cờ INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] SET col={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] .. ]3 của API được đặt Nếu có nhiều hơn một chỉ mục duy nhất được khớp, thì chỉ có chỉ mục đầu tiên được cập nhật. Không nên sử dụng câu lệnh này trên các bảng có nhiều hơn một chỉ mục duy nhất Nếu bảng có khóa chính AUTO_INCREMENT và câu lệnh chèn hoặc cập nhật một hàng, thì hàm LAST_INSERT_ID() trả về giá trị AUTO_INCREMENT của nó Hàm VALUES() chỉ có thể được sử dụng trong mệnh đề INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] SET col={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] .. ]4 và không có nghĩa trong bất kỳ ngữ cảnh nào khác. Nó trả về các giá trị cột từ phần INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] SET col={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] .. ]5 của câu lệnh. Chức năng này đặc biệt hữu ích cho chèn nhiều hàng Các tùy chọn BỎ QUA và TRÌ HOÃN bị bỏ qua khi bạn sử dụng INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] SET col={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] .. ]4 Xem Partition Pruning and Selection để biết chi tiết về mệnh đề PARTITION Câu lệnh này kích hoạt kích hoạt INSERT và UPDATE. Xem Tổng quan về trình kích hoạt để biết chi tiết Xem thêm một tuyên bố tương tự, REPLACE ví dụCREATE TABLE ins_duplicate (id INT PRIMARY KEY, animal VARCHAR(30)); INSERT INTO ins_duplicate VALUES (1,'Aardvark'), (2,'Cheetah'), (3,'Zebra'); Nếu không có khóa hiện có, câu lệnh sẽ chạy như INSERT thông thường INSERT INTO ins_duplicate VALUES (4,'Gorilla') ON DUPLICATE KEY UPDATE animal='Gorilla'; Query OK, 1 row affected (0.07 sec) SELECT * FROM ins_duplicate; +----+----------+ | id | animal | +----+----------+ | 1 | Aardvark | | 2 | Cheetah | | 3 | Zebra | | 4 | Gorilla | +----+----------+ INSERT thông thường có giá trị khóa chính là 1 sẽ không thành công do khóa hiện có INSERT INTO ins_duplicate VALUES (1,'Antelope'); ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' Tuy nhiên, chúng ta có thể sử dụng INSERT ON DUPLICATE KEY UPDATE thay thế ________số 8Lưu ý rằng có hai hàng được báo cáo là bị ảnh hưởng, nhưng điều này chỉ đề cập đến CẬP NHẬT SELECT * FROM ins_duplicate; +----+----------+ | id | animal | +----+----------+ | 1 | Antelope | | 2 | Cheetah | | 3 | Zebra | | 4 | Gorilla | +----+----------+ Thêm một cột duy nhất thứ hai INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] SET col={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] .. ]0 Trong trường hợp hai hàng khớp với các khóa duy nhất khớp, chỉ hàng đầu tiên được cập nhật. Điều này có thể không an toàn và không được khuyến khích trừ khi bạn chắc chắn mình đang làm gì INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] SET col={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] .. ]0 Mặc dù hàng thứ ba có id là 3 có id2 là 13, cũng khớp nhưng nó không được cập nhật Thay đổi id thành trường auto_increment. Nếu một hàng mới được thêm vào, auto_increment sẽ được chuyển tiếp. Nếu hàng được cập nhật, nó vẫn giữ nguyên Trước khi chèn vào cơ sở dữ liệu, tôi đang sử dụng đoạn mã sau để kiểm tra các bản sao. Đối với tôi, một bản sao chỉ được coi là một bản sao khi INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] SET col={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] .. ]6, INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] SET col={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] .. ]7, INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] SET col={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] .. ]8, INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] SET col={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] .. ]9 và INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] SET col={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] .. ]0 khớp với nhau INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] SET col={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] .. ]2 Mỗi giá trị được xác định trước khi chạy qua kiểm tra này, kết quả của tôi luôn trả về vì mục đã tồn tại. Tôi đã bỏ "dupesql" và sao chép/dán lệnh vào phpmyadmin, kết quả quay lại với số 0 Giải pháp tốt nhấtBạn muốn làm như sau INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] SET col={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] .. ]3 Xem ở đây để biết thêm thông tin Giải pháp liên quanC# – Loại bỏ các mục trùng lặp khỏi Danh sách C#Nếu bạn đang sử dụng. Net 3+, bạn có thể sử dụng LINQ INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] SET col={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] .. ]4 Mysql – Loại dữ liệu MySQL nào sẽ được sử dụng để lưu trữ các giá trị booleanĐối với MySQL 5. 0. 3 trở lên, bạn có thể sử dụng INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] SET col={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] .. ]1. hướng dẫn nói
Mặt khác, theo hướng dẫn sử dụng MySQL, bạn có thể sử dụng INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] SET col={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] .. ]2 hoặc INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] SET col={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col=expr [, col=expr] .. ]30, hiện là bí danh của tinyint(1)
MySQL cũng tuyên bố rằng
|