1062 Mục trùng lặp nhưng không có bản sao?


8

Tôi cứ bị lỗi này:

không thể XÁC NHẬN: [1062] Mục trùng lặp 'Upping Trò chơi loại của bạn- http://jessicahische.is/talkingtype ' cho khóa 'CHÍNH HÃNG'.

Vấn đề là, không có mục trùng lặp. Đó là lý do tại sao tôi bối rối khi nhận được lỗi đó.

Có cách nào để kiểm tra bằng InnoDB không?

Tôi đã thử xuất bảng và đọc mã SQL và thực hiện tìm kiếm bất kỳ bản sao nào nhưng không có.

Câu trả lời:


5

Nó không phải là nói rằng có một mục trùng lặp trong bảng đã , nó được nói rằng có đã là một mục trong đó với giá trị cho khóa chính và nó từ chối để chèn một thứ hai vì lý do đó.

Tôi nghi ngờ nếu bạn chạy:

SELECT * 
FROM   <table> 
WHERE  <keyfield> = 'Upping Your Type Game-http://jessicahische.is/talkingtype'

hoặc nếu khóa đó là một hỗn hợp

SELECT * 
FROM   <table> 
WHERE  <keyfield1> = 'Upping Your Type Game' 
AND    <keyfield2> = 'http://jessicahische.is/talkingtype'

Bạn sẽ tìm thấy một hàng phù hợp và mã của bạn tại điểm xảy ra lỗi đang cố chèn một giây.

Xử lý các bản sao trên chèn:

Nếu bạn thử INSERTmột giá trị trùng lặp cho khóa chính (hoặc chỉ mục duy nhất), bạn sẽ luôn gặp lỗi đó. Có một số cách xung quanh nó: kiểm tra trước khi bạn chèn và thực hiện cập nhật (nếu có gì đó đã thay đổi) hoặc không làm gì cả.

Ngoài ra còn có ON DUPLICATE KEY UPDATEtùy chọn cụ thể của mysql (xem /programming/1218905/how-do-i-update-if-exists-insert-if-not-aka-upsert-or-merge-in-mysql ) nếu bạn sẵn sàng hy sinh khả năng tương thích với các RDBMS khác.

Kể từ phiên bản 9.5 Postgres hỗ trợ một tính năng tương tự với cú pháp hơi khác nhau ( ON CONFLICT DO UPDATE/NOTHING- xem https://wiki.postgresql.org/wiki/UPSERT ).

MS SQL Server, Oracle và một số hệ thống khác hỗ trợ các MERGEcâu lệnh như được định nghĩa trong tiêu chuẩn SQL: 2003 (xem https://en.wikipedia.org/wiki/Merge_(Query) ) nhằm đạt được cùng chức năng và hơn thế nữa. Hãy cẩn thận với bất kỳ tùy chọn nào trong số này nếu khả năng tương thích cơ sở dữ liệu chéo là (hoặc có khả năng là trong tương lai) một trong những mục tiêu của bạn.


Thay vì lấy tất cả các bài viết từ nguồn cấp dữ liệu của tôi, tôi tự hỏi liệu tôi có nên lấy bài viết cuối cùng trong nguồn cấp dữ liệu và để nó CHỌN hoặc kiểm tra DB trước và chỉ CHỈ những gì không có ở đó. Suy nghĩ?
Chris Burton

2
Nếu bạn thử XÁC NHẬN một giá trị trùng lặp cho khóa chính (hoặc chỉ mục duy nhất), bạn sẽ luôn gặp lỗi đó. Có một số cách xung quanh nó: kiểm tra trước khi bạn chèn và thực hiện cập nhật (nếu có gì đó đã thay đổi) hoặc không làm gì cả. Ngoài ra còn có tùy chọn "ON DUPLICATE KEY UPDATE" cụ thể của mysql (xem stackoverflow.com/questions/1218905/ chủ ) nếu bạn sẵn sàng hy sinh khả năng tương thích với các RDBMS khác.
David Spillett

@DavidSpillett bạn sẽ gặp lỗi tương tự nếu một trong các giá trị bạn đang cố gắng INSERT ... ON DUPLICATE KEY UPDATE/ REPLACE INTOlà khóa ngoại không có trong bảng cha (cột). Xem câu trả lời của tôi dưới đây.
Butussy Butkus

0

Bạn có thể đã đạt đến giới hạn của cột id của mình (KHÓA CHÍNH). Chẳng hạn, nếu cột của bạn được xác định là tinyint (4), khi bạn đạt giá trị 127, bạn không thể cao hơn. Khi bạn cố gắng chèn vào cột đó, giá trị cao hơn vẫn là 127, nhưng bạn đã có một mục nhập với giá trị đó, vì vậy lỗi sẽ cho bạn biết rằng bạn cố gắng nhập một mục trùng lặp ('127').

Giải pháp: thay đổi định nghĩa về KHÓA CHÍNH của bạn thành INT cao hơn.


0

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 INTOtruy 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 INSERTtruy vấn thông thường (thay vì REPLACE INTOhoặc INSERT ... ON DUPLICATE KEY UPDATE...) là tốt.


-2

Tôi có lỗi như vậy nếu tôi bị tắt hệ thống hoặc gặp sự cố mạng. Bạn thực sự không có một bản sao trong db của bạn. Đó là mysql lỗi db ... tất cả các bạn cần phải làm là, nếu bạn làm chèn của bạn và nó không phải là sự thật, người ta chỉ ALTER của các cột của bảng mà bạn muốn chèn vào một trong hai từ varcharđể texthay bigintvà sau đó làm lại chèn . Điều đó sẽ giải quyết vấn đề.

If(!$insert){
$alter=Mysql_query("alter table `table_name` 
                    change `table_name` `table_name` bigint(255) not null");
If($alter){
//you then redo your insertion.
}
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.