Cái này thực tế không phải là lỗi...mà là "chuyện nhỏ", chỉ là "quên chút thôi", đâu có gì "to tát". Bạn tạo form đăng ký tài khoản.
Người dùng nhập:
-
Username:
admin -
Email:
admin@gmail.com
Bấm nút Đăng ký.
Mọi thứ hoạt động hoàn hảo.
Một lát sau, bạn thử đăng ký lại đúng email đó.
Và MySQL lập tức “gắt nhẹ”:
Duplicate entry 'admin@gmail.com' for key 'email'
Bạn nhìn dòng thông báo.
MySQL nhìn lại bạn.
Hai "đứa" rõ ràng đều rất...bực mình và nghĩ là "đứa kia" có vấn đề!
Ý của nó rất đơn giản:
“Bạn đã gửi cho tôi thứ mà tôi đã có rồi.” 🤡
Duplicate Entry là gì?
Nói ngắn gọn:
Duplicate entry nghĩa là bạn đang cố thêm một giá trị đã tồn tại trong cột được đặt UNIQUE.
Lỗi Duplicate entry trong MySQL xảy ra khi câu lệnh INSERT hoặc UPDATE cố gắng ghi một giá trị đã tồn tại vào cột có ràng buộc:
-
PRIMARY KEY -
UNIQUE
Ví dụ đời thường
Hãy tưởng tượng mỗi công dân chỉ có một số căn cước duy nhất.
Nếu đã có người mang số:
0123456789
thì không thể cấp lại số đó cho người khác.
Mặt khác, cũng "cùng một địa chỉ" thì lại có thể có tên nhiều người trong gia đình.
👉 Database cũng hoạt động tương tự.
Một số giá trị có thể gắn với nhiều bảng ghi. Một số giá trị phải là duy nhất.
Ví dụ đơn giản
Tạo bảng users
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(100) UNIQUE
);
Lần insert đầu tiên
INSERT INTO users (email)
VALUES ('admin@gmail.com');
✅ Thành công.
Lần insert thứ hai
INSERT INTO users (email)
VALUES ('admin@gmail.com');
❌ Lỗi:
Duplicate entry 'admin@gmail.com' for key 'email'
UNIQUE là gì?
UNIQUE có nghĩa:
Cột này không được phép có hai giá trị giống nhau.
Ví dụ rất thường gặp:
- username
- số điện thoại
- mã sản phẩm
- số căn cước
PRIMARY KEY cũng là UNIQUE
Ví dụ:
id INT AUTO_INCREMENT PRIMARY KEY
Mỗi id đều phải duy nhất.
Khi nào bạn thường gặp lỗi này?
❌ 1. Người dùng đăng ký email đã tồn tại
Tình huống phổ biến nhất.
❌ 2. Bạn bấm Submit nhiều lần
Người dùng sốt ruột.
Bấm:
- 1 lần
- 2 lần
- 3 lần 😅
👉 Lần đầu thành công, các lần sau gây duplicate entry.
❌ 3. Import dữ liệu trùng
❌ 4. Chạy lại script seed dữ liệu
❌ 5. Update thành giá trị đã tồn tại
Ví dụ thực tế bằng PHP
$sql = "INSERT INTO users (email)
VALUES ('$email')";
if (mysqli_query($conn, $sql)) {
echo "Đăng ký thành công";
} else {
echo "Lỗi: " . mysqli_error($conn);
}
Nếu email đã tồn tại, bạn sẽ thấy:
Duplicate entry 'admin@gmail.com' for key 'email'
Cách xử lý chuyên nghiệp
Kiểm tra trước khi insert
$sql = "SELECT * FROM users WHERE email='$email'";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
echo "Email này đã được sử dụng.";
} else {
// INSERT
}
Ví dụ đời thường
Trước khi bán vé máy bay, hệ thống kiểm tra:
“Ghế 12A đã có người ngồi chưa?”
Nếu có rồi:
“Xin vui lòng chọn ghế khác.” 😅
INSERT IGNORE
INSERT IGNORE INTO users (email)
VALUES ('admin@gmail.com');
👉 Nếu trùng, MySQL sẽ bỏ qua mà không báo lỗi.
ON DUPLICATE KEY UPDATE
INSERT INTO users (email, name)
VALUES ('admin@gmail.com', 'Admin')
ON DUPLICATE KEY UPDATE
name = 'Admin';
👉 Nếu chưa tồn tại → INSERT.
👉 Nếu đã tồn tại → UPDATE.
Cách debug nhanh
In lỗi
echo mysqli_error($conn);
Kiểm tra cột UNIQUE
Trong phpMyAdmin, xem tab Structure.
Chạy thử câu SQL
Copy câu SQL vào phpMyAdmin để kiểm tra.
Ví dụ “đau lòng”
Bạn viết website đăng ký.
Thử lần đầu.
Thành công.
Bạn sửa giao diện.
Thử lại.
MySQL báo:
Duplicate entry 'test@gmail.com'
Bạn tưởng code hỏng.
Thực ra chỉ vì:
Email đó đã tồn tại từ lần test trước 😅
Checklist “cứ theo là ra”
Khi gặp Duplicate entry:
- Đọc kỹ giá trị bị trùng.
- Xem cột nào có UNIQUE.
- Kiểm tra dữ liệu hiện có.
- Kiểm tra người dùng đã đăng ký chưa.
- Dùng SELECT trước khi INSERT.
Một sự thật hơi “đau”
Rất nhiều lỗi Duplicate entry không phải do code sai.
👉 Code hoàn toàn đúng.
👉 Database chỉ đang bảo vệ dữ liệu khỏi bị trùng lặp.
Tổng kết
Duplicate entry nghĩa là:
Bạn đang cố lưu một giá trị đã tồn tại trong cột phải duy nhất.
Những cột thường gặp:
- username
- phone
- product_code
👉 Đây không phải “thảm họa”.
👉 Thật ra đây là dấu hiệu database đang làm đúng nhiệm vụ của nó 😎
❓ FAQ nhanh
Duplicate entry có phải lỗi nghiêm trọng không?
→ Không. Đây là lỗi rất phổ biến.
Có nên kiểm tra trước khi INSERT?
→ Có, gần như luôn luôn.
Email nên đặt UNIQUE không?
→ Chắc chắn nên.
👉 Bạn có thể cũng đang gặp
- INSERT không chạy
- Query không có dữ liệu
- SQL syntax error
- Cannot connect to database
Không có nhận xét nào:
Đăng nhận xét