2012-02-03 85 views
11

我在现有的Magento网站上运行升级。约10分钟后,Magento的报告一个例外,当我检查在/ var错误报告文件/报告中,我看到了以下错误消息和堆栈转储:Magento 1.4.0到1.6.2.0升级的唯一约束违规

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中禁用完整性检查是一个好主意吗?

+1

禁用所有扩展在升级时恢复到默认主题? – 2012-02-03 07:19:45

+0

我没有禁用扩展或恢复到默认主题。我不确定如何解决这个问题。如果第三方扩展导致了这个错误,那么已经对数据库执行了“损害”,禁用它们将不会撤消它。 – 2012-02-05 22:45:21

+0

嗨吉姆:)为什么你应该禁用他们的原因是扩展通常工作的方式。 Magento的方式是扩展和重写,如果你需要改变一些东西,扩展名重写某些版本的magento,而不是更新到最新版本。所以基本上错误是扩展重写的东西和magento已更新这部分=冲突 – 2012-02-06 06:59:30

回答

12

该表格可以截断。 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默认为NOT 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代码保存的数据与新模式不兼容。 它也将很难清理,因为你的信息需要满足独特的索引。 最快的选择是截断表格。

+1

谢谢@txyoji这是一个很好的答案。 – 2013-01-22 03:18:01

0

这是相对容易破译的错误信息。您有一个重复的客户(或多个重复客户)。

在phpMyadmin中打开您的customer_entity表并查找重复项。取决于您有多少客户可能需要手动进行此操作,有可能重复的数据将通过您自己的'[email protected]'样式电子邮件进行测试。你应该能够安全地删除这些,一旦你走完了桌子,为自己制定了一些进展。

+0

我能够通过从命令行运行更新(即“php index.php”)来解决问题。如果数据库中存在真正重复的记录,则无论从浏览器或命令行运行更新,我都应该看到相同的错误消息。 – 2012-03-06 01:37:23