magento - Magento 1.4.0 到 1.6.2.0 升级时违反唯一约束

标签 magento

我正在现有的 Magento 站点上运行升级。大约 10 分钟后,Magento 报告异常,当我检查/var/report 中的错误报告文件时,我看到以下错误消息和堆栈转储:

a:5:{i:0;s:223:"Error in file: "/var/www/vhosts/mymagesite/app/code/core/Mage/Customer/sql/customer_setup/mysql4-upgrade-1.5.9.9-1.6.0.0.php" - SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '0-8' for key 'UNQ_BY_CUSTOMER'";i:1;s:952:"#0 /var/www/vhosts/mymagesite/app/code/core/Mage/Core/Model/Resource/Setup.php(645): Mage::exception('Mage_Core', 'Error in file: ...')
#1 /var/www/vhosts/mymagesite/app/code/core/Mage/Core/Model/Resource/Setup.php(437): Mage_Core_Model_Resource_Setup->_modifyResourceDb('upgrade', '1.4.0.0.7', '1.6.1.0')
#2 /var/www/vhosts/mymagesite/app/code/core/Mage/Core/Model/Resource/Setup.php(320): Mage_Core_Model_Resource_Setup->_upgradeResourceDb('1.4.0.0.7', '1.6.1.0')
#3 /var/www/vhosts/mymagesite/app/code/core/Mage/Core/Model/Resource/Setup.php(235): Mage_Core_Model_Resource_Setup->applyUpdates()
#4 /var/www/vhosts/mymagesite/app/code/core/Mage/Core/Model/App.php(412): Mage_Core_Model_Resource_Setup::applyAllUpdates()
#5 /var/www/vhosts/mymagesite/app/code/core/Mage/Core/Model/App.php(338): Mage_Core_Model_App->_initModules()
#6 /var/www/vhosts/mymagesite/app/Mage.php(640): Mage_Core_Model_App->run(Array)
#7 /var/www/vhosts/mymagesite/index.php(80): Mage::run('default', 'store')
#8 {main}";s:3:"url";s:16:"/index.php/admin";s:11:"script_name";s:10:"/index.php";s:4:"skin";s:7:"default";}

互联网上其他地方的一般建议是更改 <initStatements>app/etc/config.xml阅读:

<initStatements>SET NAMES utf8; SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0;</initStatements>

但是,禁用数据库完整性约束系统肯定会导致以后难以支持和解决问题。这是一个使升级脚本不会因错误而崩溃的黑客,它实际上并没有以任何方式修复问题。

StackOverflow 社区能否提供更好的解决方案,或者解释一下为什么在 MySQL 中禁用完整性检查是一个好主意?

最佳答案

该表可以截断。 http://docs.nexcess.net/magento-database-maintenance

它是收集站点使用信息的少数表格之一,这些信息对于 magento 的操作并不重要。 (如果您使用这些报告,它确实会影响客户报告。)

问题出在迁移脚本上:

/app/code/core/Mage/Customer/sql/customer_setup/mysql4-upgrade-1.5.9.9-1.6.0.0.php

它将过去默认为 NULL 的列更改为默认为非空。

ALTER TABLE `report_compared_product_index` MODIFY COLUMN `customer_id` int UNSIGNED NOT NULL COMMENT ''

该错误来自该列上的唯一索引。之前它是空的,所以 MySQL 忽略了唯一索引。一旦将其设置为默认值非空,NULL 就不再是有效值,它会尝试将列的值设置为 0。它到达第二行,现在它破坏了唯一索引,您会收到错误, http://bugs.mysql.com/bug.php?id=8173

1.4x 代码在此表中保存的数据与新架构不兼容。 它也将很难清理,因为您丢失的信息需要满足唯一索引。 最快的选择是截断表。

关于magento - Magento 1.4.0 到 1.6.2.0 升级时违反唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9123972/

相关文章:

php - Magento 1.9 在页脚显示最新产品

php - Magento- 在第 59 行的 ~/container.php 中的非对象上调用成员函数 setSaveParametersInSession()

php - Magento SEO 链接

Magento - 如何将自定义渲染添加到订单网格中的自定义列?

php - Magento 时事通讯 - 检查 GUEST 是否已订阅

magento - 电子商务中的 Varnish

magento - fatal error : Call to a member function toOptionArray() on a non-object in mysite/app/code/core/Mage/Adminhtml/Block/System/Config/Form. php 在第 463 行

php - 建议提高页面加载速度

mysql - 有什么方法可以消除 Magento 中的 cronjob

mysql - Magento 目录搜索查询约束错误