2010-03-05 115 views
3

請參閱下面的日誌。 (爲簡潔起見,被剪切掉; unsnipped @http://pastebin.com/k9sCM6Eemysql:鍵'PRIMARY'和奇怪的ID行爲重複條目'0'

簡而言之:不知何故,行被賦予ID 0。當發生這種情況時,即使這些插入實際上沒有與ID 0衝突,首先不會發生)。

雖然它被大量讀取並且插入非常嚴重(高達〜300k行/分鐘),但該表格從不更新。插入的唯一方法是導致如下所示的INSERT INTO查詢的方法。沒有外鍵或類似的東西。

a)WTF? b)如何解決?

謝謝!

$ 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' 

回答

3

你可能打到像一個錯誤:

auto increment does not work properly with InnoDB after update

你需要追蹤您正在使用,以確定修復的缺陷是否會影響你,你是否應該升級版本的更改歷史記錄。

MySQL 5.1 Change History

+0

我不認爲這是錯誤。 (我*永遠不會*直接設置ID列,因爲我認爲這是一個糟糕的想法™)。然而,升級到MySQL 5.1.44似乎已經解決了這個問題......所以我會把它稱爲足夠接近。 :-P – Sai 2010-03-07 00:56:45

相關問題