Tại sao created_at (bảng customer_entity) được đặt để thay đổi khi cập nhật?


19

Khi nhìn vào cấu trúc của customer_entitybảng, tôi nhận thấy created_attrường có thuộc tính này : on update CURRENT_TIMESTAMP. Vì vậy, mỗi khi hàng được cập nhật, created_atdấu thời gian sẽ thay đổi.

Có vẻ như thuộc tính này nên tồn tại trên updated_attrường chứ không phải created_attrường. Tôi biết rằng hiếm khi bảng này được sửa đổi trực tiếp do cấu trúc EAV, nhưng dường như vẫn chưa bao giờ sửa đổi created_attrường.

Có một lý do cho cấu trúc bảng này, hoặc nó chỉ là một lỗi?

Chỉnh sửa: Tôi tìm thấy một báo cáo lỗi được xác nhận từ Magento cho việc này. Vấn đề # 27944. Thật không may, bạn phải đăng nhập để xem nó. http: //www.magentoc Commerce.com/orms-tracking/su?su=13882


2
Câu hỏi hay. Tôi có thể nói thêm rằng các bảng đang trong tình cảnh tương tự: 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. Có thể có những người khác nữa. Tôi loại mất hứng thú tại một thời điểm, trong khi tìm kiếm chúng.
Marius

Tôi nhận thấy sales_flat_quoteđầu tiên, sau đó kiểm tra customer_entity. Chúng tôi chỉ nhận thấy điều đó vì một số báo cáo của chúng tôi không có ý nghĩa gì. Đây thực sự có thể là một lỗi?
Ryre

Tôi tin rằng nó chỉ là một lỗi.
Dmytro Zavalkin

Tôi có cách nào để chúng ta có thể làm việc xung quanh đó không? Xin lỗi tôi là người mới và đang gặp phải vấn đề tương tự vì tôi đã nâng cấp từ 1.7.0.2 lên 1.8.1. Tôi gần như sợ thử chỉnh sửa trường trong cơ sở dữ liệu. Hy vọng bạn có thể giúp !! Cảm ơn Jinal
Jinal

@Jinal, lựa chọn tốt nhất của bạn là thực hiện các thay đổi thông qua mysql. Kiểm tra câu trả lời của Marius để biết thêm chi tiết và đảm bảo sao lưu cơ sở dữ liệu của bạn trước!
Ryre

Câu trả lời:


22

Đây là những gì tôi tìm thấy. Vấn đề chỉ xuất hiện trên Magento CE 1.6+ (và phù hợp với các phiên bản EE). Đó là do các tập lệnh cài đặt / nâng cấp mới sử dụng DDL kết hợp với mysql.
Trong các phiên bản trước 1.6, đây là cách created_atupdated_atcác cột trông như thế nào:

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

Trong 1.6+ ddl trông như thế này:

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

và tạo:

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

Sự khác biệt là defaultgiá trị bị thiếu.
Và, như được mô tả ở đây ,

Với cả DEFAULT CURRENT_TIMESTAMP cũng như CẬP NHẬT CURRENT_TIMESTAMP, cũng giống như chỉ định cả DEFAULT CURRENT_TIMESTAMP và TRÊN CẬP NHẬT CURRENT_TIMESTAMP.

Và vì MySQL chỉ cho phép một cột dấu thời gian CURRENT_TIMESTAMPlà mặc định hoặc cho on update, nên created_atcột kết thúc như thế này.

Đây chắc chắn là một lỗi Magento.


1
đã có bản cập nhật nào từ magento về điều này chưa? Có vẻ như lỗi vẫn ở trạng thái mới.
Laura

@Laura, liên kết theo dõi lỗi trong câu trả lời vẫn hiển thị là mở (gần 2 năm rồi!).
Ryre

2
Trong Magento 1.9, cột created_at cho biết: created_atdấu thời gian KHÔNG NULL DEFAULT CURRENT_TIMESTAMP TRÊN CẬP NHẬT COMRENT_TIMESTAMP COMMENT 'Tạo tại'. Và trong ghi chú phát hành, nó đã đề cập rằng "Ngày" khách hàng "là chính xác."
MagePologistso

Đối với EE, nó ảnh hưởng đến các phiên bản TRƯỚC 1.6, tôi có EE 1.13 và có vẻ như thế này: `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Created At'
doc_id

4

Trước hết, hãy đọc câu trả lời của Marius để xem những gì đang xảy ra trong cơ sở dữ liệu.

Tôi chỉ muốn đề cập rằng hầu hết các nhà phát triển sẽ không gặp phải vấn đề này nếu mô hình của họ mở rộng đúng cách Mage_Core_Model_Abstract. Ngăn xếp trông như thế này:

  1. Your_Model::save cuộc gọi
  2. Mage_Core_Model_Abstract::save cuộc gọi
  3. Mage_Eav_Model_Entity_Abstract::save cuộc gọi
  4. Mage_Eav_Model_Entity_Abstract::_beforeSave cuộc gọi
  5. Mage_Eav_Model_Entity_Abstract::walkAttributes cuộc gọi
  6. Mage_Eav_Model_Entity_Attribute_Backend_Time_Created::beforeSave

Điều này thực hiện như sau:

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

Chỉ cần lưu ý rằng điều này có thể có vấn đề đối với một số địa điểm trong cả CE> = 1.8.x và EE> = 1.13.x.


2

Chúng tôi cũng đã tìm thấy lỗi này và nghĩ rằng nó dựa trên sự khác biệt giữa mã hóa ngày của Hoa Kỳ và Châu Âu.

Ở Hoa Kỳ, ngày tháng được viết MM-DD-YYYY. (02-10-2015 = ngày 10 tháng 2 năm 2015). Nhưng ở châu Âu và nhiều nơi khác, ngày tháng được viết DD-MM-YYYY. (02-10-2015 = ngày 2 tháng 10 năm 2015 hoặc ngày 2 tháng 10 năm 2015).

Trong khi Magento có trụ sở tại Mỹ, phần lớn sự phát triển được thực hiện bởi các lập trình viên ở Ukraine. 

Chúng tôi đã sửa lỗi này bằng tiện ích mở rộng Magento miễn phí (để bạn không phải thay đổi bất kỳ Mã lõi Magento nào). Chúng tôi đã đưa nó lên trang web của chúng tôi dưới dạng tải xuống miễn phí: http://www.CustomerParadigm.com/doad/Magento-Date-Switch-Fix-Extension.zip

Tôi đã trình bày chi tiết hơn về blog của chúng tôi ở đây: http://www.customerparadigm.com/magento-orms-magento-customer-create-date-juxtap vị trí /


1
Blog bưu chính, mô-đun chỉ kéo từ bài SE của tôi ở đây: magento.stackexchange.com/a/31225
Tyler V.

-1

ce 1.9 đã sửa lỗi trong ce 1.8.1 Dưới đây là khác biệt: nhập mô tả hình ảnh ở đây


1
Mã mới ở đây không phải là một sửa chữa cho vấn đề này. Nó chỉ xác nhận định dạng "DDDD-DD-DD DD: DD: DD" hoặc trả về null. Null đó vẫn sẽ truy cập vào cơ sở dữ liệu và trở thành bất cứ giá trị mặc định nào của cột.
Tyler V.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.