【问题标题】:MySQL Duplicate entry '16777216' for key 1 Error键 1 错误的 MySQL 重复条目“16777216”
【发布时间】:2011-05-20 10:01:55
【问题描述】:

我有一个 MySQL 数据库,它通过 C# 应用程序填充,以 100+ 百万条记录的规模大量上传记录。导入这些记录后,对数据使用进一步的分析和其他评分工具。当我选择较小的数据子集时,记录很好,但是,当我使用完整数据集时,一旦达到记录 #16777216,就会发生此错误。在我进行唯一的主要设置之前,到处都在创建重复的 ID 记录,但数据都进入了。但是,有了重复记录,进一步的处理会产生不正确的结果。

我的问题很简单,有没有人听说过这个问题,如果有,是怎么回事?这是我的 MySQL 版本中的错误吗?我在 Windows XP 上运行 MySQL 5.0.67。

非常感谢!!

【问题讨论】:

  • 16777216 是 24 位整数中值的最大数量。您在 PRIMARY 和 UNIQUE 列中使用的值的大小是多少?
  • 主键字段是 BIGINT 主键,非空无符号自增。
  • 我发现非常巧合的是,16777216 会是记录#当这是一个非常具体的数据类型相关时会一直失败#但我在任何地方都找不到这个问题的证据。
  • 另外,当数据类型只是 INTEGER 但也允许超过 16777216 条记录时,我最初看到了这个问题。请注意,在将其设置为主键之前,记录进入那里,只是在超过记录 ID 16777216 后随机出现重复。这听起来完全像一个错误,但我找不到任何证据出现在任何地方的错误。如果它是某种类型的已知错误会有所帮助。

标签: sql mysql mysql-error-1062


【解决方案1】:

只是好奇……

您没有使用 load data infile 来填充表的任何特殊原因?

如果您需要在加载之前在应用程序中处理数据,您仍然可以这样做,但输出到 csv 文件而不是调用 sproc 1 亿次。加载数据文件会更快!

请看这里 - http://dev.mysql.com/doc/refman/5.1/en/load-data.html

你真的需要一个 bigint 无符号主键(8 字节)与最大值为 4294967295(40 亿)的无符号整数(4 字节)

请看这里 - http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

只是想法......

【讨论】:

  • 如果我正在执行加载 infile,当负载从 db 一次又一次地插入到写入和读取创建的 CSV 的 I/O 时,这将如何进行比较?我曾向另一位开发人员建议过此操作,他说最初在 I/O 方面存在很多性能问题...谢谢!
  • 创建一个包含 1 亿行 ++ 行的 .csv 文件不会花费很长时间,但您可以将其拆分为 10 个文件,例如 1000 万行,然后使用 load data infile 分别加载每个文件。我想你目前的加载方法需要几个小时,如果不是更多的话。使用您的应用程序生成 1 个或多个 .csv 文件,然后批量加载您将在 20 分钟内完成。这里有一些有用的提示pastie.org/1348793 - 希望对您有所帮助。
  • 当前方法绝对需要永远。我一定会做出这个改变,谢谢!
  • 我的 CSV 在 mysql 提示符下工作,但我不知道如何在 .NET 代码中正确调用它。感谢任何帮助,感谢在完整脚本上调用 ExecuteNonQuery 只是出错
【解决方案2】:

您确定某处不涉及MEDIUMINT 吗?在显示此问题的表上运行 show create table

【讨论】:

  • 以下是拆分为 2 个 cmets 的结果:
  • 指标 | CREATE TABLE metrics (classification int(11) 默认 NULL, edit_distance int(11) 默认 NULL, edit_goodness float 默认 NULL, shorter_name_len int(11) 默认 NULL, spatial_distance float(30, 2)默认NULL,spatial_precision_degfloat(30,5)默认NULL,spatial_goodnessfloat(30,5)默认NULL,
  • feature_type_distance double 默认 NULL,score float(30,3) NOT NULL,metrics_id bigint(20) unsigned NOT NULL auto_increment,ch_unique_feature_idint(11) 默认 NULL,@ 987654335@ int(11) 默认 NULL,ref_unique_feature_id int(11) 默认 NULL,ref_unique_name_id int(11) 默认 NULL,set_id int(11) 默认 NULL,主键 (metrics_id)) ENGINE=InnoDB AUTO_INCREMENT=16777217 默认字符集=latin1 | +---------+-------------------------------------- -----------------
  • @Dan:我认为这里没有任何问题。为数据库提供数据的 C# 代码可能有问题。
  • C# call: sqrstart = "call inmetrics ("; sqrest = "?Classification, ?EditDistance, ?EditGoodness, ?ShorterNameLen, ?SpatialDistance, "; sqrest1 = "?SpatialPrecisionDeg, ?SpatialGoodness, ?FeatureTypeDistance , ?MetricsID, "; sqrest2 = "?ChUniqueFeatureID, ?ChUniqueNameID, ?RefUniqueFeatureID, ?RefUniqueNameID, ?SetID)";
猜你喜欢
  • 2019-02-23
  • 1970-01-01
  • 2014-02-02
  • 2018-05-01
  • 2017-02-17
  • 2011-07-13
  • 1970-01-01
  • 2013-01-15
  • 2015-02-10
相关资源
最近更新 更多