- 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 là đượ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
là 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.