Почему create_at (таблица customer_entity) изменяется при обновлении?

19

При взгляде на структуру customer_entityтаблицы, я заметил , что created_atполе имеет этот атрибут: on update CURRENT_TIMESTAMP. Таким образом, каждый раз, когда строка обновляется, created_atотметка времени изменяется.

Кажется, этот атрибут должен существовать на updated_atполе, а не на created_atполе. Я знаю, что редко эта таблица модифицируется напрямую из-за структуры EAV, но все равно кажется неправильным модифицировать created_atполе.

Есть ли причина для этой структуры таблицы, или это просто ошибка?

Изменить: я нашел подтвержденный отчет об ошибке от Magento для этого. Выпуск № 27944. К сожалению, вы должны войти, чтобы просмотреть его. http://www.magentocommerce.com/bug-tracking/issue?issue=13882

Ryre
источник
2
Хороший вопрос. Я мог бы добавить , что эти таблицы находятся в одной и той же ситуации: cron_schedule, api_user, admin_user, customer_entity_address, downloadable_link_purchased, downloadable_link_purchased_item, index_event, eav_entity log_customer, sales_flat_quote_address, sales_flat_quote, sales_flat_quote_address_item, sales_flat_quote_payment, sales_flat_quote_shipping_rate, sales_recurring_profile. Там могут быть и другие. Я как бы потерял интерес в какой-то момент, когда искал их.
Мариус
Я sales_flat_quoteсначала заметил , потом проверил customer_entity. Мы только заметили это, потому что некоторые из наших отчетов не имели никакого смысла. Может ли это быть ошибкой?
Ryre
Я считаю, что это просто ошибка.
Дмитрий Завалкин
Есть ли способ, как мы можем обойти это? Извините, я новичок и столкнулся с той же проблемой, так как я обновил с 1.7.0.2 до 1.8.1 Я почти боюсь попробовать изменить поле в базе данных. Надеюсь, вы можете помочь! Спасибо Джинал
Джинал
@Jinal, ваш лучший вариант - вносить изменения через mysql. Проверьте ответ Мариуса для более подробной информации, и сначала сделайте резервную копию вашей базы данных!
Ryre

Ответы:

22

Вот что я нашел. Проблема появляется только в Magento CE 1.6+ (и соответствующих версиях EE). Это из-за новых скриптов установки / обновления, использующих DDL в сочетании с mysql.
В версиях до 1.6 это, как created_atи updated_atстолбцов выглядело так:

`created_at` datetime NOT NULL default '0000-00-00 00:00:00',
`updated_at` datetime NOT NULL default '0000-00-00 00:00:00', 

В 1.6+ ddl выглядит так:

    ->addColumn('created_at', Varien_Db_Ddl_Table::TYPE_TIMESTAMP, null, array(
        'nullable'  => false,
        ), 'Created At')
    ->addColumn('updated_at', Varien_Db_Ddl_Table::TYPE_TIMESTAMP, null, array(
        'nullable'  => false,
        ), 'Updated At')

и генерирует:

`created_at` timestamp NOT NULL COMMENT 'Created At',
`updated_at` timestamp NOT NULL COMMENT 'Updated At',

Разница в том, что defaultзначение отсутствует.
И, как описано здесь ,

Ни с DEFAULT CURRENT_TIMESTAMP, ни с ON UPDATE CURRENT_TIMESTAMP, это то же самое, что указать DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP.

А поскольку MySQL допускает только один столбец отметки времени со CURRENT_TIMESTAMPзначением по умолчанию или для on update, created_atстолбец заканчивается следующим образом.

Это определенно ошибка Magento.

Мариус
источник
1
было ли обновление от magento по этому поводу? Кажется, ошибка все еще находится в новом состоянии.
Лаура
@Laura, ссылка для отслеживания ошибок в ответе по-прежнему отображается как открытая (уже почти 2 года!).
Ryre
2
В Magento 1.9 в столбце create_at указано: created_atотметка времени NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Создано в'. И в примечаниях к выпуску упоминается, что «клиент, поскольку« дата верна ».
MagePsycho
Для EE это влияет на версии ДО 1.6, у меня есть EE 1.13, и это выглядит так: `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Created At'
doc_id
4

Прежде всего, прочитайте ответ Мариуса, чтобы увидеть, что происходит в базе данных.

Я просто хотел упомянуть, что большинство разработчиков не столкнется с этой проблемой, если их модель должным образом расширится Mage_Core_Model_Abstract. Стек выглядит так:

  1. Your_Model::save звонки
  2. Mage_Core_Model_Abstract::save звонки
  3. Mage_Eav_Model_Entity_Abstract::save звонки
  4. Mage_Eav_Model_Entity_Abstract::_beforeSave звонки
  5. Mage_Eav_Model_Entity_Abstract::walkAttributes звонки
  6. Mage_Eav_Model_Entity_Attribute_Backend_Time_Created::beforeSave

Это делает следующее:

$attributeCode = $this->getAttribute()->getAttributeCode();
$date = $object->getData($attributeCode);
if (is_null($date)) {
    if ($object->isObjectNew()) {
        $object->setData($attributeCode, Varien_Date::now());
    }
}

Просто отметьте, что это может иметь проблемы для некоторых локалей как в CE> = 1.8.x, так и в EE> = 1.13.x.

Тайлер В.
источник
2

Мы тоже нашли эту ошибку и думаем, что она основана на разнице между американским и европейским кодированием дат.

В Соединенных Штатах даты пишутся ММ-ДД-ГГГГ. (02-10-2015 = 10 февраля 2015 г.) Но в Европе и многих других местах даты пишутся ДД-ММ-ГГГГ. (02-10-2015 = 2 октября 2015 г. или 2 октября 2015 г.).

В то время как Magento базируется в США, большая часть разработки была сделана программистами в Украине. 

Мы исправили эту ошибку с помощью бесплатного расширения Magento (чтобы вам не приходилось изменять код ядра Magento). Мы разместили его на нашем сайте для бесплатной загрузки: http://www.CustomerParadigm.com/download/Magento-Date-Switch-Fix-Extension.zip

Я рассказал об этом более подробно в нашем блоге здесь: http://www.customerparadigm.com/magento-bug-magento-customer-create-date-juxtaposition/

Джефф Финкельштейн
источник
1
Сообщение в блоге и модуль только что взяты из моего сообщения SE здесь: magento.stackexchange.com/a/31225
Тайлер В.
-1

CE 1.9 исправил ошибку в CE 1.8.1 Ниже приведен diff: введите описание изображения здесь

user12529
источник
1
Новый код здесь не является решением этой проблемы. Он просто проверяет формат «DDDD-DD-DD DD: DD: DD» или возвращает ноль. Этот ноль все равно попадет в базу данных и станет тем же значением, что и столбцы по умолчанию.
Тайлер В.