Tôi vừa nhận được cùng một lỗi. Bảng của tôi chỉ có 1 hàng và không trùng lặp.
TLDR: kiểm tra khóa ngoại của bạn, đảm bảo giá trị tồn tại trong bảng cha. MySQL 5.6.3 rõ ràng không thể cho bạn biết lý do thực sự của lỗi.
mysql> select * from users_sessions;
+---------+----------------------------+---------------------+
| user_id | session_id | last_accessed |
+---------+----------------------------+---------------------+
| 3 | 6n02k8catt2kdn30b92ljtrpc6 | 2019-01-13 23:30:53 |
+---------+----------------------------+---------------------+
1 row in set (0.00 sec)
mysql>
mysql> INSERT INTO `users_sessions` VALUES(3,"fbfibdog1qumlj5mg4kstbagu7","2019-01-14 18:37:15") ON DUPLICATE KEY UPDATE last_accessed = "2019-01-14 18:37:15";
ERROR 1062 (23000): Duplicate entry '3-fbfibdog1qumlj5mg4kstbagu7' for key 'PRIMARY'
Không có khóa trùng lặp như vậy!
Tôi đã thử chạy cùng một phần chèn mà không có ON DUPLICATE KEY ...
mệnh đề, và có manh mối tốt hơn về những gì đang xảy ra.
mysql> INSERT INTO `users_sessions` VALUES(3,"fbfibdog1qumlj5mg4kstbagu7","2019-01-14 18:37:15");
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`login`.`users_sessions`, CONSTRAINT `fk_sessions_id` FOREIGN KEY (`session_id`) REFERENCES `sessions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
Bây giờ chúng tôi vào một cái gì đó. Vì vậy, tôi cố gắng chạy truy vấn ban đầu với một giá trị khác nhau mà không có một giá trị tương ứng trong bảng chính nước ngoài. Các truy vấn chạy mà không có vấn đề.
Tại sao MySQL dường như phát hành lỗi sai? Tôi không chắc, nhưng có lẽ phải làm theo cách ON DUPLICATE KEY UPDATE
được thực hiện. Tôi đã thử chạy cùng một truy vấn chèn như một REPLACE INTO
truy vấn và nhận được cùng một lỗi.
mysql> REPLACE INTO `users_sessions` VALUES(3,"fbfibdog1qumlj5mg4kstbagu7","2019-01-14 18:37:15");
ERROR 1062 (23000): Duplicate entry '3-fbfibdog1qumlj5mg4kstbagu7' for key 'PRIMARY'
Nếu bạn gặp phải lỗi này mà không có lý do rõ ràng, hãy kiểm tra các khóa ngoại của bạn. Hãy thử một INSERT
truy vấn thông thường (thay vì REPLACE INTO
hoặc INSERT ... ON DUPLICATE KEY UPDATE...
) là tốt.