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

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ố 8

Lư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ất

Bạ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 quan

C# – 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

Kể từ MySQL 5. 0. 3, kiểu dữ liệu BIT được sử dụng để lưu trữ các giá trị trường bit. Một loại BIT(M) cho phép lưu trữ các giá trị M-bit. M có thể nằm trong khoảng từ 1 đến 64

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)

Bool, Boolean. Các loại này là từ đồng nghĩa với TINYINT(1). Giá trị bằng 0 được coi là sai. Các giá trị khác không được coi là đúng

MySQL cũng tuyên bố rằng

Chúng tôi dự định triển khai xử lý kiểu boolean đầy đủ, theo SQL tiêu chuẩn, trong bản phát hành MySQL trong tương lai

Làm cách nào để kiểm tra các bản sao trước khi chèn SQL?

Tạo truy vấn chèn ban đầu của bạn, chẳng hạn như "INSERT INTO your_table ( column1 , column2 ) VALUES ('1','a');"
Thay đổi truy vấn bằng cách thêm quy tắc cho những việc cần làm nếu tìm thấy khóa trùng lặp, chẳng hạn như "CHÈN VÀO_bảng_của_bạn ( cột1 , cột2 ) GIÁ TRỊ ('1','a') TRÊN CẬP NHẬT KHÓA DUPLICATE cột1 ='1', cột2

Làm cách nào để ngăn chèn trùng lặp trong MySQL?

Lưu ý − Sử dụng lệnh INSERT IGNORE thay vì lệnh INSERT . Nếu một bản ghi không trùng lặp với một bản ghi hiện có, thì MySQL sẽ chèn nó như bình thường. Nếu bản ghi trùng lặp, thì từ khóa IGNORE yêu cầu MySQL loại bỏ nó một cách âm thầm mà không tạo ra lỗi.

Làm cách nào để chèn mục nhập trùng lặp trong MySQL?

Câu lệnh Chèn khi cập nhật khóa trùng lặp là phần mở rộng của câu lệnh INSERT trong MySQL. Khi chúng ta chỉ định mệnh đề ON DUPLICATE KEY UPDATE trong câu lệnh SQL và một hàng sẽ gây ra giá trị lỗi trùng lặp trong cột chỉ mục UNIQUE hoặc PRIMARY KEY, thì việc cập nhật hàng hiện có sẽ xảy ra.

Làm cách nào để tránh chèn các bản ghi trùng lặp trong SQL Server bằng trình kích hoạt?

Câu trả lời hay nhất .
Tạo một CHẾ ĐỘ XEM cho bảng của bạn ( CHỌN * TỪ MyTable);
Tạo trình kích hoạt INSTEAD-OF INSERT TRÊN chế độ xem thực hiện thao tác chèn
Tạo CHỈ SỐ DUY NHẤT "MyUniqueIndexName" trên các cột bạn cần để tránh trùng lặp
Sử dụng phần NGOẠI LỆ sau trên TRIGGER