Cơ sở dữ liệu MySQL hỗ trợ một cách rất thuận tiện để CHÈN hoặc CẬP NHẬT một bản ghi. Đây là phần mở rộng không chuẩn cho cú pháp SQL, được hỗ trợ bởi jOOQ và được mô phỏng trong RDBMS khác, nếu điều này có thể thực hiện được [e. g. nếu chúng hỗ trợ câu lệnh MERGE tiêu chuẩn SQL]. Đây là một ví dụ về cách sử dụng mệnh đề ON DUPLICATE KEY UPDATE
// Add a new author called "Koontz" with ID 3. // If that ID is already present, update the author's name create.insertInto[AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME] .values[3, "Koontz"] .onDuplicateKeyUpdate[] .set[AUTHOR.LAST_NAME, "Koontz"] .execute[];
Cơ sở dữ liệu MySQL cũng hỗ trợ mệnh đề INSERT IGNORE INTO. Điều này được jOOQ hỗ trợ bằng cách sử dụng biến thể cú pháp SQL thuận tiện hơn của ON DUPLICATE KEY IGNORE
// Add a new author called "Koontz" with ID 3. // If that ID is already present, ignore the INSERT statement create.insertInto[AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME] .values[3, "Koontz"] .onDuplicateKeyIgnore[] .execute[];
Nếu cơ sở dữ liệu bên dưới không có cách nào để "bỏ qua" các câu lệnh INSERT
bị lỗi, [e. g. MySQL qua INSERT IGNORE
], jOOQ có thể mô phỏng câu lệnh bằng cách sử dụng câu lệnh MERGE hoặc sử dụng INSERT . SELECT WHERE NOT EXISTS:
Câu lệnh Insert Ignore trong MySQL có một tính năng đặc biệt bỏ qua các hàng không hợp lệ bất cứ khi nào chúng ta chèn một hoặc nhiều hàng vào một bảng. Chúng ta có thể hiểu nó với lời giải thích sau đây, trong đó một bảng chứa cột khóa chính
Cột khóa chính không thể lưu trữ các giá trị trùng lặp vào một bảng. Ví dụ: student_roll_number phải luôn là duy nhất cho mỗi học sinh. Tương tự, employee_id trong công ty phải luôn khác biệt trong bảng employee. Khi chúng tôi cố gắng chèn một bản ghi trùng lặp vào một bảng có cột khóa chính, nó sẽ tạo ra thông báo lỗi. Tuy nhiên, nếu chúng ta sử dụng câu lệnh INSERT IGNORE để thêm các hàng trùng lặp vào một bảng có cột khóa chính, MySQL sẽ không tạo ra bất kỳ lỗi nào. Câu lệnh này được ưu tiên khi chúng tôi đang cố gắng chèn hàng loạt bản ghi và các lỗi dẫn đến có thể làm gián đoạn quá trình thực thi. Kết quả là, nó không lưu trữ bất kỳ bản ghi nào vào một bảng. Trong trường hợp như vậy, câu lệnh INSERT IGNORE chỉ tạo ra các cảnh báo
Dưới đây là các trường hợp câu lệnh INSERT IGNORE tránh được lỗi
- Khi chúng tôi sẽ cố gắng chèn một khóa trùng lặp trong đó cột của bảng có ràng buộc CHÍNH hoặc ĐỘC ĐÁO KEY
- Khi chúng tôi sẽ cố gắng thêm một giá trị NULL trong đó cột của bảng có ràng buộc NOT NULL
- Khi chúng tôi cố gắng chèn một bản ghi vào một bảng được phân vùng trong đó các giá trị đã nhập không khớp với định dạng của các phân vùng được liệt kê
cú pháp
Sau đây là cú pháp để sử dụng câu lệnh INSERT IGNORE trong MySQL
MySQL CHÈN BỎ QUA Ví dụ
Hãy cho chúng tôi hiểu cách câu lệnh INSERT IGNORE hoạt động trong MySQL với sự trợ giúp của một ví dụ. Đầu tiên, chúng ta cần tạo một bảng có tên là "Student" bằng cách sử dụng câu lệnh sau
Ràng buộc ĐỘC ĐÁO đảm bảo rằng chúng tôi không thể chèn các giá trị trùng lặp vào cột email. Tiếp theo, yêu cầu chèn các bản ghi vào bảng. Chúng ta có thể thực hiện câu lệnh dưới đây để thêm dữ liệu vào bảng
Cuối cùng, thực hiện câu lệnh SELECT để xác minh thao tác chèn
Chúng ta có thể thấy đầu ra bên dưới nơi chúng ta có ba hàng trong bảng
Hãy để chúng tôi thực hiện câu lệnh dưới đây sẽ cố gắng thêm hai bản ghi vào bảng
Nó sẽ tạo ra một lỗi. LỖI 1062 [23000]. Mục nhập trùng lặp '[email được bảo vệ]' cho khóa 'sinh viên. Email' vì email có ràng buộc ĐỘC ĐÁO
Bây giờ, hãy xem điều gì đã xảy ra nếu chúng ta sử dụng câu lệnh INSERT IGNORE vào truy vấn trên
MySQL sẽ tạo ra một thông báo. một hàng được thêm vào và hàng kia bị bỏ qua
Chúng ta có thể xem cảnh báo chi tiết bằng lệnh SHOW WARNINGS
Vì vậy, chúng ta có thể nói rằng nếu chúng ta sử dụng câu lệnh INSERT IGNORE, MySQL sẽ đưa ra cảnh báo thay vì đưa ra lỗi
MySQL CHÈN BỎ QUA và chế độ NGHIÊM TÚC
Trong MySQL, STRICT MODE xử lý các giá trị không hợp lệ hoặc bị thiếu sẽ được thêm vào bảng bằng cách sử dụng câu lệnh INSERT OR UPDATE. Nếu chế độ nghiêm ngặt được BẬT và chúng tôi đang cố gắng thêm các giá trị không hợp lệ vào bảng bằng cách sử dụng câu lệnh INSERT, câu lệnh sẽ bị hủy bỏ và chúng tôi sẽ nhận được thông báo lỗi
Tuy nhiên, nếu chúng ta sử dụng lệnh INSERT IGNORE, MySQL sẽ đưa ra một thông báo cảnh báo thay vì đưa ra lỗi. Ngoài ra, câu lệnh này cố gắng cắt bớt các giá trị để làm cho chúng hợp lệ trước khi chèn nó vào bảng
Hãy để chúng tôi hiểu nó với sự giúp đỡ của một ví dụ. Đầu tiên, chúng ta sẽ tạo một bảng có tên "Test" bằng cách sử dụng câu lệnh bên dưới
Trong bảng trên, cột họ tên chỉ nhận chuỗi có độ dài nhỏ hơn hoặc bằng 5 ký tự. Bây giờ, hãy thực hiện câu lệnh dưới đây để chèn các bản ghi vào một bảng
Chúng ta có thể thấy rằng tên được chỉ định xác thực ràng buộc cột tên nên nó sẽ được thêm thành công. Thực hiện câu lệnh SELECT để kiểm tra kết quả. Nó sẽ cho đầu ra như dưới đây
Tiếp theo, chèn tên có độ dài lớn hơn năm
MySQL không thêm giá trị và đưa ra thông báo lỗi vì chế độ nghiêm ngặt được BẬT. Tuy nhiên, nếu chúng ta sử dụng câu lệnh INSERT IGNORE để chèn cùng một chuỗi, nó sẽ đưa ra thông báo cảnh báo thay vì đưa ra lỗi
Cuối cùng, chúng tôi đã thực hiện lệnh SHOW WARNINGS để kiểm tra thông báo cảnh báo. Đầu ra bên dưới giải thích rõ ràng hơn rằng MySQL cố gắng cắt bớt dữ liệu trước khi chèn nó vào bảng