2010-03-05 4 views
3

Voir le journal ci-dessous. En bref: d'une certaine façon, les lignes reçoivent l'ID 0. Lorsque cela se produit, elles bloquent les insertions, même si ces insertions ne sont pas en conflit avec l'ID 0 (bien que cela ne soit pas vraiment le cas). n'arrive pas en premier lieu).mysql: Dupliquer l'entrée '0' pour la clé 'PRIMARY' et le comportement d'identification bizarre

Bien qu'elle soit fortement lue et très fortement insérée (jusqu'à ~ 300k lignes/min), cette table n'est jamais mise à jour. La seule méthode qui insère est celle qui aboutit aux requêtes INSERT INTO comme ci-dessous. Il n'y a pas de clés étrangères ou similaires.

a) WTF? b) Comment le réparer?

Merci!

$ mysql --version 
mysql Ver 14.14 Distrib 5.1.30, for apple-darwin9.4.0 (i386) using readline 5.1 

$ mysql 

mysql> SHOW CREATE TABLE visitations \G 
*************************** 1. row *************************** 
     Table: visitations 
Create Table: CREATE TABLE `visitations` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `scraping_id` int(11) NOT NULL, 
    `site_id` int(11) NOT NULL, 
    `visited` tinyint(1) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `index_visitations_on_scraping_id_and_site_id` (`scraping_id`,`site_id`), 
    KEY `index_visitations_on_site_id` (`site_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=23525407 DEFAULT CHARSET=latin1 
1 row in set (0.00 sec) 

mysql> show triggers; 
Empty set (0.04 sec) 

mysql> INSERT INTO `visitations` (`scraping_id`,`site_id`,`visited`) VALUES (647,196,0),(647,51679,0),(647,13689,0),(647,85739,1),(647,4388,0),(647,100346,0),(647,1245,0),[snip]; 
ERROR 1062 (23000): Duplicate entry '0' for key 'PRIMARY' 

mysql> SELECT * FROM `visitations` WHERE (`scraping_id`,`site_id`,`visited`) IN ((647,196,0),(647,51679,0),(647,13689,0),(647,85739,1),(647,4388,0),(647,100346,0),(647,1245,0),[snip]); 
Empty set (1 min 27.43 sec) 

mysql> select * from visitations where id = 0; 
+----+-------------+---------+---------+ 
| id | scraping_id | site_id | visited | 
+----+-------------+---------+---------+ 
| 0 |   645 | 46177 |  0 | 
+----+-------------+---------+---------+ 
1 row in set (0.00 sec) 

mysql> delete from visitations where id < 363; 
Query OK, 363 rows affected (0.11 sec) 

mysql> select * from visitations where id = 0; 
Empty set (0.00 sec) 

mysql> INSERT INTO `visitations` (`scraping_id`,`site_id`,`visited`) VALUES (647,196,0),(647,51679,0),(647,13689,0),(647,85739,1),(647,4388,0),(647,100346,0),(647,1245,0),[snip]; 
Query OK, 500 rows affected (0.23 sec) 
Records: 500 Duplicates: 0 Warnings: 0 

mysql> select * from visitations where id = 0; 
Empty set (0.00 sec) 

mysql> INSERT INTO `visitations` (`scraping_id`,`site_id`,`visited`) VALUES (647,196,0),(647,51679,0),(647,13689,0),(647,85739,1),(647,4388,0),(647,100346,0),(647,1245,0),[snip]; 
ERROR 1062 (23000): Duplicate entry '647-196' for key 'index_visitations_on_scraping_id_and_site_id' 

Répondre

3

Vous avez probablement touché un bug comme:

auto increment does not work properly with InnoDB after update

Vous devez suivre l'historique des modifications de la version que vous utilisez pour déterminer si des bugs fixes peuvent affecter vous et si vous devez mettre à jour .

MySQL 5.1 Change History

+0

Je ne pense pas que ce soit le bogue. (Je n'ai * jamais * directement défini la colonne id, car je pense que c'est une mauvaise idée ™.) Cependant, la mise à niveau vers mysql 5.1.44 semble avoir résolu le problème ... donc je l'appellerai assez proche. :-P – Sai