MySQL дает дубликат ошибки ввода при попытке увеличить поле даты? - PullRequest
1 голос
/ 06 августа 2011

Я читаю данные из файла 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?

Ответы [ 2 ]

2 голосов
/ 28 января 2012

Это проблема того, как работает MySQL UPDATE, строка за строкой, как объяснил p.cambell. Еще один способ обойти эту проблему - явно указать движку, как заказывать обновления (еще одна причуда MySQL):

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

Правило большого пальца: Если вы хотите увеличить PK (или другой уникальный ключ), упорядочите по убыванию. Если вы хотите уменьшить PK, упорядочите по возрастанию.

1 голос
/ 06 августа 2011

Похоже, вы пытаетесь обновить значения PK в таблице. В стороне: предложите найти другой ПК для этой таблицы. Вот что происходит.

Ряд за строкой:

  • обновить PK для 2011-06-29, чтобы оно было 2011-06-30. Это успешно , так как нет другой строки с таким значением PK.
  • обновить PK для 2011-07-19, чтобы оно было 2011-07-20. Этот завершается с ошибкой , поскольку уже есть другая строка с этим значением PK. PK существующей строки еще не был увеличен. Мы нарушили ограничение PK.

Предложите изменить свой подход к:

  • Удалите все ваши новые данные в таблице и перезагрузите их из источника, как вы делаете сейчас.
  • использовать промежуточную / временную таблицу, если удаление не вариант. Возможно, вы захотите менять строки выборочно в соответствии с вашими потребностями.
...