Чому для оновлення встановлюється зміна create_at (таблиця_спроможність клієнта)?


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


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. Ми щойно помітили це, оскільки деякі наші звіти не мали жодного сенсу. Чи справді це може бути помилка?
Райре

Я вважаю, що це просто помилка.
Дмитро Завалкін

Чи є якимось чином ми можемо обійти це? Вибачте, що я новачок і зіткнувся з тією ж проблемою, оскільки я оновив з 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, ані ОНОВЛЕНО CURRENT_TIMESTAMP, це те саме, що вказати як DEFAULT CURRENT_TIMESTAMP, так і НА UPDATE CURRENT_TIMESTAMP.

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

Це, безумовно, помилка Magento.


1
чи були якісь оновлення від Магенто з цього приводу? здається, помилка все ще знаходиться в новому стані.
Лаура

@Laura, посилання відстеження помилок у відповіді все ще відображається як відкрита (майже 2 роки зараз!).
Ryre

2
У Magento 1.9 у стовпці create_at написано: created_atчасова марка NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPATE 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

Ми теж знайшли цю помилку і думаємо, що вона заснована на різниці між кодуванням дат США та Європи.

У Сполучених Штатах дати записуються MM-DD-YYYY. (10.10.2015 = 10 лютого 2015 р.). Але в Європі та багатьох інших місцях дати записуються DD-MM-YYYY. (02-10-2015 = 2 жовтня 2015 або 2 жовтня 2015).

Незважаючи на те, що Magento базується в США, значна частина розробок була здійснена програмістами в Україні. 

Ми виправили цю помилку за допомогою безкоштовного розширення Magento (так що вам не доведеться змінювати будь-який Magento Core Code). Ми розмістили його на нашому сайті як безкоштовне завантаження: 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
Tyler V.

-1

ce 1.9 мають виправити помилку в ce 1.8.1 нижче: введіть тут опис зображення


1
Новий код тут не вирішує цю проблему. Він просто підтверджує формат "DDDD-DD-DD DD: DD: DD" або повертає нульове значення. Цей нуль все одно потрапить у базу даних і стане будь-яким значенням стовпців за замовчуванням.
Тайлер В.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.