MySQL TRÊN KHÓA DUPLICATE BỎ QUA

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

Làm cách nào để bỏ qua các bản ghi trùng lặp trong MySQL?

Cách xóa các hàng trùng lặp trong MySQL .
lựa chọn 1. Xóa các hàng trùng lặp bằng INNER JOIN
Lựa chọn 2. Xóa các hàng trùng lặp bằng bảng trung gian
Tùy chọn 3. Xóa các hàng trùng lặp bằng ROW_NUMBER[]

Cập nhật khóa trùng lặp có chậm không?

Bước đầu tiên thực hiện tìm kiếm đĩa trên tập dữ liệu lớn với khóa chính đặc biệt [hoặc khóa duy nhất]. Và đó là lý do tại sao nó chậm. Vì vậy, đạo đức của câu chuyện là thế này. Trong MySQL, “chèn … vào bản cập nhật khóa trùng lặp” chậm hơn “thay thế thành” .

Làm cách nào để sử dụng khi cập nhật khóa 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ì quá trình cập nhật của hàng hiện có sẽ xảy ra.

Khóa chính có thể có các giá trị trùng lặp trong MySQL không?

Vì cả khóa chính và cột duy nhất không chấp nhận các giá trị trùng lặp nên chúng có thể được sử dụng để xác định duy nhất một bản ghi trong bảng. Điều này có nghĩa là, đối với mỗi giá trị trong cột khóa chính hoặc khóa duy nhất, sẽ chỉ có một bản ghi được trả về.

Chủ Đề