Warum ist created_at (customer_entity table) so eingestellt, dass es sich beim Update ändert?

19

Wenn bei der Struktur der Suche customer_entityTisch, bemerkte ich das created_atFeld dieses Attribut hat: on update CURRENT_TIMESTAMP. Jedes Mal, wenn die Zeile aktualisiert wird, created_atändert sich der Zeitstempel.

Anscheinend sollte dieses Attribut auf dem updated_atFeld vorhanden sein, nicht auf dem created_atFeld. Ich weiß, es ist selten, dass diese Tabelle aufgrund der EAV-Struktur direkt geändert wird, aber es scheint immer noch falsch, das created_atFeld jemals zu ändern .

Gibt es einen Grund für diese Tabellenstruktur oder ist es nur ein Fehler?

Bearbeiten: Ich habe einen bestätigten Fehlerbericht von Magento dafür gefunden. Ausgabe # 27944. Leider musst du dich einloggen, um es zu sehen. http://www.magentocommerce.com/bug-tracking/issue?issue=13882

Ryre
quelle
2
Gute Frage. Ich mag hinzufügen , dass diese Tabellen in der gleichen Situation sind: 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. Es könnte auch andere geben. Irgendwann verlor ich das Interesse, als ich nach ihnen suchte.
Marius
Ich bemerkte es sales_flat_quotezuerst und überprüfte es dann customer_entity. Wir haben es nur bemerkt, weil einige unserer Berichte keinen Sinn ergaben. Kann das wirklich ein Bug sein?
Ryre
Ich glaube, es ist nur ein Fehler.
Dmytro Zavalkin
Können wir das irgendwie umgehen? Tut mir leid, ich bin ein Neuling und stehe vor dem gleichen Problem, da ich von 1.7.0.2 auf 1.8.1 aktualisiert habe. Ich habe fast Angst, das Feld in der Datenbank zu bearbeiten. Hoffe du kannst helfen !! Danke Jinal
Jinal
@Jinal, Ihre beste Option ist es, die Änderungen über MySQL vorzunehmen. Überprüfen Sie die Antwort von Marius auf weitere Details und stellen Sie sicher, dass Sie zuerst Ihre Datenbank sichern!
Ryre

Antworten:

22

Hier ist was ich gefunden habe. Das Problem tritt nur bei Magento CE 1.6+ (und entsprechenden EE-Versionen) auf. Dies liegt an den neuen Installations- / Upgrade-Skripten, die DDL in Kombination mit MySQL verwenden.
In Versionen vor 1.6 sahen die Spalten created_atund folgendermaßen updated_ataus:

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

In 1.6+ sieht die ddl so aus:

    ->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')

und erzeugt:

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

Der Unterschied besteht darin, dass der defaultWert fehlt.
Und, wie hier beschrieben ,

Weder DEFAULT CURRENT_TIMESTAMP noch ON UPDATE CURRENT_TIMESTAMP entsprechen der Angabe von DEFAULT CURRENT_TIMESTAMP und ON UPDATE CURRENT_TIMESTAMP.

Und da MySQL nur eine Zeitstempelspalte CURRENT_TIMESTAMPals Standard oder für zulässt on update, created_atendet die Spalte so.

Dies ist definitiv ein Magento-Fehler.

Marius
quelle
1
Wurde diesbezüglich ein Update von Magento veröffentlicht? es scheint, dass der Fehler immer noch im neuen Zustand ist.
Laura
@Laura, der Bug-Tracking-Link in der Antwort wird immer noch als offen angezeigt (jetzt fast 2 Jahre!).
Ryre
2
In Magento 1.9 heißt es in der Spalte created_at: created_attimestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Created At'. In den Versionshinweisen wird erwähnt, dass das Datum "Kunde seit" korrekt ist.
MagePsycho
Für EE betrifft es die Versionen BEFORE 1.6, ich habe EE 1.13 und es sieht so aus: `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Created At'
doc_id
4

Lesen Sie zuerst die Antwort von Marius, um zu sehen, was in der Datenbank passiert.

Ich wollte nur erwähnen, dass die meisten Entwickler nicht auf dieses Problem stoßen, wenn ihr Modell ordnungsgemäß erweitert wird Mage_Core_Model_Abstract. Der Stack sieht folgendermaßen aus:

  1. Your_Model::save Anrufe
  2. Mage_Core_Model_Abstract::save Anrufe
  3. Mage_Eav_Model_Entity_Abstract::save Anrufe
  4. Mage_Eav_Model_Entity_Abstract::_beforeSave Anrufe
  5. Mage_Eav_Model_Entity_Abstract::walkAttributes Anrufe
  6. Mage_Eav_Model_Entity_Attribute_Backend_Time_Created::beforeSave

Dies bewirkt Folgendes:

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

Beachten Sie, dass dies bei einigen Ländereinstellungen sowohl in CE> = 1.8.x als auch in EE> = 1.13.x Probleme verursachen kann.

Tyler V.
quelle
2

Auch wir haben diesen Fehler gefunden und glauben, dass er auf dem Unterschied zwischen der Datumskodierung in den USA und in Europa beruht.

In den USA sind die Daten in MM-TT-JJJJ angegeben. (02.10.2015 = 10.02.2015). In Europa und vielen anderen Ländern sind die Daten jedoch TT-MM-JJJJ. (02-10-2015 = 2. Oktober 2015 oder 2. Oktober 2015).

Während Magento in den USA ansässig ist, wurde ein Großteil der Entwicklung von Programmierern in der Ukraine durchgeführt. 

Wir haben diesen Fehler mit einer kostenlosen Magento-Erweiterung behoben (damit Sie keinen Magento-Core-Code ändern müssen). Wir haben es auf unserer Website als kostenlosen Download bereitgestellt: http://www.CustomerParadigm.com/download/Magento-Date-Switch-Fix-Extension.zip

Ich habe dies in unserem Blog hier ausführlicher behandelt: http://www.customerparadigm.com/magento-bug-magento-customer-create-date-juxtaposition/

Jeff Finkelstein
quelle
1
Blogpost
Tyler V.
-1

ce 1.9 habe den Fehler in ce 1.8.1 behoben. Unten ist der Unterschied: Bildbeschreibung hier eingeben

user12529
quelle
1
Der neue Code hier behebt dieses Problem nicht. Es überprüft nur das Format "DDDD-DD-DD DD: DD: DD" oder gibt null zurück. Diese Null erreicht die Datenbank weiterhin und wird zu dem Standardwert für die Spalten.
Tyler V.