【问题标题】:MySQL giving duplicate Entry error when trying to increment date field?MySQL 在尝试增加日期字段时给出重复的条目错误?
【发布时间】:2011-08-06 16:49:19
【问题描述】:

我正在从 XML 文件中读取数据。由于源错误是一天了,所以在加载到数据库后,我使用这个 SQL 语句来增加日期。

UPDATE 2011_electricity SET DATE = DATE_ADD( DATE, INTERVAL 1 DAY )

上周运行良好,但现在出现错误:

MySQL said: 

#1062 - Duplicate entry '2011-07-20' for key 1 

我在数据字段上有一个主键。这是数据库的外观:

                date        energy  daynum
        2011-06-29  0.05    4197
        2011-07-19  0.20    4219
        2011-07-20  17.07   4220
        2011-07-21  11.56   4221
        2011-07-22  18.18   4222
        2011-07-23  24.92   4223
        2011-07-24  10.56   4224
        2011-07-25  12.68   4225
        2011-07-26  10.06   4226
        2011-07-27  19.72   4227
        2011-07-28  19.02   4228
        2011-07-29  17.92   4229
        2011-07-30  14.49   4230
        2011-07-31  10.84   4231
        2011-08-01  13.38   4232
        2011-08-02  14.86   4233

我在那里看不到任何重复,所以不明白错误,有没有更好的方法来执行 mysql 代码以将日期递增 1?

【问题讨论】:

    标签: mysql duplicates increment


    【解决方案1】:

    这是一个关于 MySQL 的 UPDATE 如何工作的问题,正如 p.cambell 所解释的那样。绕过这个问题的另一种方法是明确告诉引擎如何订购更新(另一个 MySQL 怪癖):

    UPDATE 2011_electricity 
    SET DATE = DATE_ADD( DATE, INTERVAL 1 DAY )
    ORDER BY DATE DESC 
    

    经验法则:如果您想增加 PK(或其他唯一键),请按降序排列。如果要减少 PK,请按升序排列。

    【讨论】:

      【解决方案2】:

      听起来您正在尝试更新表中的 PK 值。旁白:建议为这张桌子寻找另一个PK。这是正在发生的事情。

      逐行:

      • 2011-06-29 的PK 更新为2011-06-30。这成功,因为没有其他行具有该 PK 值。
      • 2011-07-19 的PK 更新为2011-07-20。这失败,因为已经有另一行具有该 PK 值。预先存在的行的 PK 尚未增加。我们现在已经违反了 PK 约束。

      建议修改您的方法:

      • 删除表中的所有新数据,并像现在一样从源重新加载。
      • 如果不能删除,请利用暂存/临时表。您可能希望根据需要有选择地换出行。

      【讨论】:

      • 谢谢,有道理,但它在上周使用了一周的数据!我想临时表是前进的方向,我不认为我可以做任何简单的事情,比如告诉 UPDATE 将结果写入新表?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-16
      • 1970-01-01
      • 2012-11-19
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多