更新時にcreated_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


2
良い質問。私は、これらのテーブルは、同じような状況にあることを追加される場合があります:cron_scheduleapi_useradmin_usercustomer_entity_addressdownloadable_link_purchaseddownloadable_link_purchased_itemindex_eventeav_entity log_customersales_flat_quote_addresssales_flat_quotesales_flat_quote_address_itemsales_flat_quote_paymentsales_flat_quote_shipping_ratesales_recurring_profile。他にもあるかもしれません。それらを探している間、ある時点で興味を失いました。
マリウス

sales_flat_quote最初に気づいた後、チェックしましたcustomer_entity。気付いたのは、レポートの一部が意味をなさないためです。これは本当にバグですか?
ライア

これは単なるバグだと思います。
ドミトロZavalkin

私はそれを回避する方法がありますか?私は初心者であり、1.7.0.2から1.8.1にアップグレードして以来、同じ問題に直面しています。データベースのフィールドを編集しようとするのはほとんど怖いです。あなたが助けることができることを願っています!! ありがとうジナル
ジナル

@Jinal、あなたの最良の選択肢は、mysql経由で変更を加えることです。詳細についてはマリウスの答えを確認し、最初にデータベースをバックアップしてください!
ライア14年

回答:


22

これが私が見つけたものです。この問題は、Magento CE 1.6+(および一致するEEバージョン)でのみ表示されます。これは、mysqlと組み合わせてDDLを使用する新しいインストール/アップグレードスクリプトが原因です。
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デフォルトまたはforのタイムスタンプ列が1つしか許可されていないためon updatecreated_at列は次のようになります。

これは間違いなくMagentoのバグです。


1
これに関するmagentoからの更新はありますか?バグはまだ新しい状態にあるようです。
ローラ14

@Laura、答えのバグ追跡リンクはまだ開いていると表示されます(約2年後!)。
ライア14

2
Magento 1.9では、created_at列は次のように表示されます。created_atタイムスタンプNOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Created At'。また、リリースノートには、「 "customer since"日付が正しい」と記載されています。
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と表記されます。(2015年2月10日= 2015年2月10日)。しかし、ヨーロッパや他の多くの場所では、日付はDD-MM-YYYYと書かれています。(2015年2月10日= 2015年10月2日、または2015年10月2日)。

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
タイラー

-1

ce 1.9はce 1.8.1のバグを修正しました。以下は差分です: ここに画像の説明を入力してください


1
ここでの新しいコードは、この問題の修正ではありません。「DDDD-DD-DD DD:DD:DD」形式を検証するか、nullを返します。そのnullは引き続きデータベースにヒットし、カラムのデフォルト値が何であれなります。
タイラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.