为什么将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。可能还会有其他人。在搜寻它们时,我有时会失去兴趣。
Marius

sales_flat_quote首先注意到,然后检查customer_entity。我们只是注意到了这一点,因为我们的某些报告没有任何意义。这真的是一个错误吗?
Ryre

我相信这只是一个错误。
Dmytro Zavalkin

我有什么办法可以解决这个问题?抱歉,我是新手,由于从1.7.0.2升级到1.8.1以来,我面临着同样的问题,我几乎不敢尝试编辑数据库中的字段。希望你能帮忙!感谢Jinal
Jinal 2014年

@Jinal,最好的选择是通过mysql进行更改。检查Marius的答案以获取更多详细信息,并确保首先备份数据库!
Ryre 2014年

Answers:


22

这是我发现的。该问题仅在Magento CE 1.6+(和匹配的EE版本)上出现。这是因为新的安装/升级脚本结合了DDL和mysql。
在1.6之前的版本中,created_atand 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仅允许使用一个timestamp列CURRENT_TIMESTAMP作为default或for on update,因此该created_at列最终像这样。

这绝对是一个Magento错误。


1
magento对此有任何更新吗?该错误似乎仍处于新状态。
劳拉

@Laura,答案中的错误跟踪链接仍然显示为打开状态(将近2年!)。
Ryre 2014年

2
在Magento 1.9中,created_at列显示:created_attimestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT'Created At'。在发行说明中,提到““客户自”日期是正确的”。
MagePsycho 2014年

对于EE,它会影响1.6之前的版本,我使用的是EE 1.13,它看起来像这样: `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Created At'
doc_id 2015年

4

首先,请阅读Marius的答案以了解数据库中正在发生的事情。

我只想提一下,如果他们的模型正确扩展的话,大多数开发者不会遇到这个问题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年10月2日= 2015年10月2日,或2015年10月2日)。

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中的错误,以下是差异: 在此处输入图片说明


1
此处的新代码无法解决此问题。它仅验证“ DDDD-DD-DD DD:DD:DD”格式,或返回null。该null仍将命中数据库,并成为列的默认值。
Tyler V.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.