【问题标题】:mysql: Duplicate entry '0' for key 'PRIMARY' and bizarre ID behaviormysql:键'PRIMARY'的重复条目'0'和奇怪的ID行为
【发布时间】:2010-03-05 23:19:02
【问题描述】:

请参阅下面的日志。 (为简洁而截取;未截取@http://pastebin.com/k9sCM6Ee)

简而言之:不知何故,行被分配了 ID 0。发生这种情况时,它会阻止插入,即使这些插入实际上并没有与 ID 0 冲突(尽管这实际上不应该首先发生)。

虽然它被大量读取和非常大量插入(高达 ~300k 行/分钟),但此表永远不会更新。插入的唯一方法是导致如下 INSERT INTO 查询的方法。没有外键之类的。

a) 怎么回事? 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'

【问题讨论】:

    标签: mysql sql indexing mysql-error-1062


    【解决方案1】:

    你可能遇到了这样的错误:

    auto increment does not work properly with InnoDB after update

    您需要跟踪您正在使用的版本的更改历史记录,以确定已修复的错误是否会影响您以及是否应该升级。

    MySQL 5.1 Change History

    【讨论】:

    • 我不认为这是错误。 (我 从不 直接设置 id 列,因为我认为这是一个坏主意™。)但是,升级到 mysql 5.1.44 似乎已经解决了这个问题......所以我称之为 close足够的。 :-P
    猜你喜欢
    • 1970-01-01
    • 2012-08-24
    • 2013-09-03
    • 2017-08-07
    • 2018-02-20
    • 2014-09-04
    • 2023-03-07
    • 2015-09-13
    相关资源
    最近更新 更多