Điều này là do khi bạn có [các] cột trong bảng có ràng buộc
INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
8 hoặc INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
9, thì MySQL sẽ đưa ra lỗi mỗi khi truy vấn của bạn chèn một hàng mới với các giá trị trùng lặp cho các cột đóTuy nhiên, nếu bạn chỉ muốn thực hiện thao tác chèn khi dữ liệu chưa tồn tại, thì bạn cần tạo một giải pháp khắc phục với các câu lệnh do MySQL cung cấp
Có ba cách bạn có thể thực hiện truy vấn “chèn nếu không tồn tại” trong MySQL
- Sử dụng câu lệnh
0INSERT INTO users [user_id, first_name, last_name] VALUES [202, "Tony", "Smith"];
- Sử dụng mệnh đề
0INSERT INTO users [user_id, first_name, last_name] VALUES [202, "Tony", "Smith"];
- Hoặc sử dụng câu lệnh
1INSERT INTO users [user_id, first_name, last_name] VALUES [202, "Tony", "Smith"];
Hãy nhớ rằng trước khi bạn tạo truy vấn chèn nếu không tồn tại, bảng MySQL đang sử dụng phải có sẵn một hoặc nhiều cột với ràng buộc
INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
8 hoặc INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
9Nếu không đặt ràng buộc cho cột mà bạn muốn phân biệt, thì các truy vấn bên dưới sẽ không hoạt động như dự kiến
Chèn một hàng mới nếu không tồn tại bằng INSERT IGNORE
Câu lệnh MySQL
INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
0 thường được sử dụng để thay đổi lỗi mà MySQL đưa ra khi bạn sử dụng câu lệnh INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
5 bình thường thành một cảnh báo để việc thực thi truy vấn của bạn không bị gián đoạnVí dụ: giả sử bạn có bảng
INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
6 với dữ liệu sau+---------+------------+-----------+
| user_id | first_name | last_name |
+---------+------------+-----------+
| 202 | Thor | Odinson |
| 204 | Loki | Laufeyson |
+---------+------------+-----------+
2 rows in set [0.00 sec]
Cột
INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
7 ở trên là trường INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
8, vì vậy MySQL sẽ báo lỗi nếu bạn cố chèn một hàng mới với một trong các giá trị INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
7 hiện cóTruy vấn trên sử dụng giá trị
INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
7 của ERROR 1062 [23000]: Duplicate entry '202' for key 'users.PRIMARY'
1INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
Vì vậy, MySQL sẽ tạo ra lỗi sau
________số 8
Câu lệnh
INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
0 sẽ khiến MySQL không làm gì khi quá trình chèn gây ra lỗi. Nếu không có lỗi thì một hàng mới sẽ được thêm vào bảngKhi bạn chạy truy vấn sau
INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
1MySQL sẽ tạo ra đầu ra sau
INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
2Với câu lệnh
INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
0, MySQL sẽ chỉ chèn một hàng mới nếu các giá trị không tồn tại trong bảngCập nhật hàng hiện có với giá trị duy nhất bằng mệnh đề ON DUPLICATE KEY UPDATE
Mệnh đề
INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
0 cho phép bạn cập nhật hàng với giá trị mới khi tìm thấy giá trị trùng lặp trong chỉ mục INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
9 hoặc cột INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
8Mệnh đề có thể được thêm vào cuối truy vấn MySQL
INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
5 như hình bên dướiINSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
5Đầu tiên, MySQL sẽ thực hiện truy vấn chèn thông thường ở trên. Khi tìm thấy một giá trị trùng lặp, thì MySQL sẽ thực hiện cập nhật thay vì chèn
Truy vấn này hữu ích nếu bạn vẫn muốn hàng được cập nhật khi giá trị duy nhất đã tồn tại
Sử dụng câu lệnh REPLACE khi đã tồn tại một giá trị duy nhất
Câu lệnh
INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
1 là một thay thế cho mệnh đề INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
0Tuyên bố về cơ bản thực hiện hai điều
- MySQL sẽ kiểm tra bản ghi hiện có để xem liệu một hàng có cùng giá trị duy nhất đã tồn tại chưa
- Khi một hàng có cùng giá trị duy nhất được tìm thấy, thì hàng đó sẽ bị xóa bằng cách sử dụng câu lệnh
10. MySQL sau đó sẽ chạy câu lệnhINSERT INTO users [user_id, first_name, last_name] VALUES [202, "Tony", "Smith"];
5 để thay thế hàng đã xóaINSERT INTO users [user_id, first_name, last_name] VALUES [202, "Tony", "Smith"];
Khi không có kết quả khớp trong bản ghi hiện có, thì câu lệnh
INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
1 hoạt động giống như câu lệnh INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
5 thông thườngĐây là một ví dụ về câu lệnh
INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
1 đang hoạt độngINSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
3Hàng có giá trị
INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
7 của ERROR 1062 [23000]: Duplicate entry '202' for key 'users.PRIMARY'
1 sẽ được thay thế bằng các giá trị trên nếu nó đã tồn tạiPhần kết luận
Và đó là ba cách bạn có thể thực hiện truy vấn chèn MySQL nếu không tồn tại
Cá nhân tôi thích thực hiện một truy vấn
INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
5 bình thường và xử lý lỗi do MySQL đưa ra từ phía phụ trợCác ngôn ngữ lập trình như JavaScript, PHP, Ruby và Python đều có khối
INSERT INTO users
[user_id, first_name, last_name]
VALUES
[202, "Tony", "Smith"];
18 mà bạn có thể sử dụng để xử lý lỗi khi thực thi truy vấn MySQLNhưng nếu bạn phải xử lý logic “chèn nếu không tồn tại” từ phía MySQL, thì ba phương pháp trên là lựa chọn tốt nhất của bạn