Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách CHÈN nếu hàng không tồn tại (UPSERT) trong MySQL

  • Sử dụng INSERT IGNORE
  • Sử dụng REPLACE
  • Sử dụng INSERT ... ON DUPLICATE KEY UPDATE

MySQL cung cấp một số câu lệnh hữu ích khi cần INSERT hàng sau xác định xem hàng đó trên thực tế là hàng mới hay đã tồn tại.

Dưới đây, chúng tôi sẽ xem xét ba phương pháp khác nhau và lần lượt giải thích ưu và nhược điểm của từng phương pháp để bạn nắm chắc cách định cấu hình các câu lệnh của riêng mình khi cung cấp dữ liệu mới hoặc có khả năng tồn tại cho INSERTION .

Sử dụng INSERT IGNORE

Sử dụng INSERT IGNORE khiến MySQL bỏ qua một cách hiệu quả lỗi thực thi khi cố gắng thực hiện INSERT các câu lệnh. Điều này có nghĩa là một INSERT IGNORE câu lệnh chứa giá trị trùng lặp trong UNIQUE chỉ mục hoặc PRIMARY KEY trường không tạo ra lỗi, nhưng thay vào đó sẽ đơn giản bỏ qua INSERT cụ thể đó chỉ huy hoàn toàn. Mục đích rõ ràng là thực thi một số lượng lớn INSERT các câu lệnh cho sự kết hợp của cả dữ liệu đã tồn tại trong cơ sở dữ liệu cũng như dữ liệu mới được đưa vào hệ thống.

Ví dụ:books của chúng tôi bảng có thể đã chứa một vài bản ghi:

mysql> SELECT * FROM books LIMIT 3;
+----+-------------------------+---------------------+----------------+
| id | title                   | author              | year_published |
+----+-------------------------+---------------------+----------------+
|  1 | In Search of Lost Time  | Marcel Proust       |           1913 |
|  2 | Ulysses                 | James Joyce         |           1922 |
|  3 | Don Quixote             | Miguel de Cervantes |           1605 |
+----+-------------------------+---------------------+----------------+
3 rows in set (0.00 sec)

Nếu chúng ta có một loạt lớn dữ liệu mới và hiện có cần INSERT và một phần của dữ liệu đó chứa giá trị phù hợp cho id trường (là một trường UNIQUE PRIMARY_KEY trong bảng), sử dụng INSERT cơ bản sẽ tạo ra một lỗi mong đợi:

mysql> INSERT INTO books
    (id, title, author, year_published)
VALUES
    (1, 'Green Eggs and Ham', 'Dr. Seuss', 1960);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

Mặt khác, nếu chúng ta sử dụng INSERT IGNORE , nỗ lực sao chép bị bỏ qua và không có lỗi dẫn đến xảy ra:

mysql> INSERT IGNORE INTO books
    (id, title, author, year_published)
VALUES
    (1, 'Green Eggs and Ham', 'Dr. Seuss', 1960);
Query OK, 0 rows affected (0.00 sec)

Sử dụng REPLACE

Trong trường hợp bạn thực sự muốn thay thế các hàng trong đó INSERT các lệnh sẽ tạo ra lỗi do trùng lặp UNIQUE hoặc PRIMARY KEY như đã nêu ở trên, một tùy chọn là chọn REPLACE tuyên bố.

Khi phát hành một REPLACE tuyên bố, có hai kết quả có thể xảy ra cho mỗi lệnh được ban hành:

  • Không tìm thấy hàng dữ liệu hiện có nào có các giá trị phù hợp và do đó, một INSERT chuẩn câu lệnh được thực hiện.
  • Hàng dữ liệu phù hợp được tìm thấy, khiến hàng hiện có đó bị xóa với DELETE tiêu chuẩn câu lệnh, sau đó là INSERT bình thường được thực hiện sau đó.

Ví dụ:chúng ta có thể sử dụng REPLACE để hoán đổi bản ghi hiện có của chúng tôi về id = 1 trong Tìm kiếm thời gian đã mất của Marcel Proust với Green Eggs and Ham của Tiến sĩ Seuss:

mysql> REPLACE INTO books
    (id, title, author, year_published)
VALUES
    (1, 'Green Eggs and Ham', 'Dr. Seuss', 1960);
Query OK, 2 rows affected (0.00 sec)

Lưu ý rằng mặc dù chúng tôi chỉ thay đổi một hàng, kết quả cho thấy rằng hai các hàng bị ảnh hưởng bởi vì chúng tôi thực sự DELETED hàng hiện có rồi đến INSERTED hàng mới để thay thế nó.

Thông tin thêm về cách sử dụng REPLACE có thể được tìm thấy trong tài liệu chính thức.

Sử dụng INSERT ... ON DUPLICATE KEY UPDATE

Phương pháp thay thế (và thường được ưu tiên) cho INSERTING thành các hàng có thể chứa UNIQUE trùng lặp hoặc PRIMARY KEY giá trị là sử dụng INSERT ... ON DUPLICATE KEY UPDATE tuyên bố và mệnh đề.

Không giống như REPLACE - một lệnh phá hủy vốn có do DELETE các lệnh mà nó thực hiện khi cần thiết - sử dụng INSERT ... ON DUPLICATE KEY UPDATE không phá hủy , trong đó nó sẽ chỉ phát hành INSERT hoặc UPDATE câu lệnh, nhưng không bao giờ DELETE .

Ví dụ:chúng tôi đã quyết định muốn thay thế id = 1 của chúng tôi kỷ lục của Green Eggs and Ham và hoàn nguyên nó về bản gốc Đi tìm thời gian đã mất ghi lại thay thế. Do đó, chúng tôi có thể lấy INSERT ban đầu của chúng tôi và thêm ON DUPLICATE KEY UPDATE mới mệnh đề:

mysql> SET @id = 1,
    @title = 'In Search of Lost Time',
    @author = 'Marcel Proust',
    @year_published = 1913;
INSERT INTO books
    (id, title, author, year_published)
VALUES
    (@id, @title, @author, @year_published)
ON DUPLICATE KEY UPDATE
    title = @title,
    author = @author,
    year_published = @year_published;

Lưu ý rằng chúng tôi đang sử dụng UPDATE bình thường cú pháp (nhưng loại trừ table không cần thiết tên và SET từ khóa) và chỉ gán non-UNIQUE các giá trị. Ngoài ra, mặc dù không cần thiết đối với ON DUPLICATE KEY UPDATE để hoạt động bình thường, chúng tôi cũng đã chọn sử dụng user variables vì vậy chúng tôi không cần chỉ định các giá trị thực mà chúng tôi muốn INSERT hoặc UPDATE nhiều lần.

Do đó, id = 1 của chúng tôi bản ghi được đúng UPDATED như mong đợi:

mysql> SELECT * FROM books LIMIT 1;
+----+------------------------+---------------+----------------+
| id | title                  | author        | year_published |
+----+------------------------+---------------+----------------+
|  1 | In Search of Lost Time | Marcel Proust |           1913 |
+----+------------------------+---------------+----------------+
1 row in set (0.00 sec)

Có thể tìm thêm thông tin trong tài liệu chính thức.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi nghiêm trọng:toán tử [] không được hỗ trợ cho chuỗi

  2. Ví dụ SYSDATE () - MySQL

  3. Số lần đếm Mysql của chuỗi con, sau đó sắp xếp theo thứ tự

  4. Cách tính toán trung bình động trong MySQL

  5. Cách khóa một hàng