0

解决

来自开发人员:问题是以前版本的代码仍在写入使用手动 ID 而不是自动增量的表。自我注意:始终检查表写入的其他可能位置。

我们在表中得到重复的键。它们不是同时插入的(相隔 6 小时)。

表结构:

CREATE TABLE `table_1` (
  `sales_id` int(10) unsigned NOT NULL auto_increment,
  `sales_revisions_id` int(10) unsigned NOT NULL default '0',
  `sales_name` varchar(50) default NULL,
  `recycle_id` int(10) unsigned default NULL,
  PRIMARY KEY  (`sales_id`),
  KEY `sales_revisions_id` (`sales_revisions_id`),
  KEY `sales_id` (`sales_id`),
  KEY `recycle_id` (`recycle_id`)
) ENGINE= MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=26759 ;

插入:

insert into `table_1` ( `sales_name` ) VALUES ( "Blah Blah" )

我们使用 PHP5 运行 MySQL 5.0.20,并使用 mysql_insert_id() 在插入查询后立即检索插入 ID。

4

6 回答 6

5

过去我在 MySql 数据库中突然出现了一些重复键错误,即使定义了主键和 auto_increment。每次都是因为表已损坏。

如果它已损坏,则执行检查表应该会暴露问题。您可以通过运行:

CHECK TABLE tbl_name

如果它无论如何都以损坏的形式返回(通常会说大小比实际应该大),那么只需运行以下命令来修复它:

REPAIR TABLE tbl_name
于 2009-02-05T04:34:36.063 回答
2

sales_id 字段是否有主键(或唯一键)?如果不是,那么其他东西可能正在重新使用现有数字进行插入或更新。我所说的“其他东西”不仅仅是指代码。它可能是一个可以访问数据库的人意外地这样做。

于 2009-02-05T00:37:54.463 回答
2

正如另一个所说;以你的例子是不可能的。

它与您的问题无关,但您不必为主键列创建单独的 KEY - 当您已经拥有唯一(主)键时,它只是向表添加一个额外的非唯一索引。

于 2009-02-05T03:15:41.930 回答
2

我们在表中得到重复的键。

您的意思是您在尝试插入时遇到错误,还是您的某些值多次存储在列中?

仅当您从 INSERT 中省略列或尝试插入 NULL 或零时,自动增量才会生效。否则,您可以在 INSERT 语句中指定一个值,覆盖自动增量机制。例如:

INSERT INTO table_1 (sales_id) VALUES (26759);

如果您指定的值已存在于表中,您将收到错误消息。

于 2009-02-05T04:22:43.043 回答
1

请发布此查询的结果:

SELECT `sales_id`, COUNT(*) AS `num`
FROM `table_1`
GROUP BY `sales_id`
HAVING `num` > 1
ORDER BY `num` DESC
于 2009-02-05T04:35:12.927 回答
0
  • 如果您在其他字段上有唯一键,那可能就是问题所在。

  • 如果您的 auto_increment 列的值已达到最大值,MySQL 将继续尝试重新插入它。例如,如果 sales_id 是一个 tinyint 列,则在您达到 id 127 后会出现重复键错误。

于 2009-02-05T01:53:34.437 回答