Magento订单保存错误:完整性约束违规

时间:2012-03-13 16:24:23

标签: magento constraints integrity

当我在Magento使用信用卡/借记卡订购时,我收到以下错误:

Order saving error: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '282-189' for key 2

我无法得到确切的痕迹,因为它只是不想向我显示,但是,我已经在app/code/core/Mage/Checkout/controllers/OnepageController.php(未经编辑)上追溯到501。确切的行是:

$this->getOnepage()->saveOrder();

现在,逻辑告诉我这只是两个在尝试添加订单时具有相同密钥的订单,或者我完全错了?

无论如何,除此之外,解决这个问题的最佳方法是什么?我曾想过导出订单,将它们全部删除,然后重新导入它们,但我觉得它不起作用。

我正在使用Magento 1.6.2.0

编辑:我刚刚意识到,如果我发现哪个表未通过完整性检查,我可能会清空该表(取决于它是哪个表),这会自行修复吗?关于如何找出哪个表格搞乱的任何想法?

EDIT2:所以在OğuzÇelikdemir的回答之后,结果证明以下是罪魁祸首:

2012-03-14T13:59:01+00:00 DEBUG (7): SQL: INSERT INTO `sales_order_tax_item` (`tax_id`, `item_id`, `tax_percent`) VALUES (?, ?, ?) (254, 8, 10)
2012-03-14T13:59:01+00:00 DEBUG (7): SQL: INSERT INTO `sales_order_tax_item` (`tax_id`, `item_id`, `tax_percent`) VALUES (?, ?, ?) (254, 8, 10)

显然,无法插入两个相同的tax_id。任何人都知道如何解决它?

3 个答案:

答案 0 :(得分:3)

截断以下log表。为了保护自己,请从CONSOLE备份,而不是在Magento。

TRUNCATE `log_customer`;
ALTER TABLE `log_customer` AUTO_INCREMENT=1;
TRUNCATE `log_quote`;
ALTER TABLE `log_quote` AUTO_INCREMENT=1;
TRUNCATE `log_summary`;
ALTER TABLE `log_summary` AUTO_INCREMENT=1;
TRUNCATE `log_visitor_info`;
ALTER TABLE `log_visitor_info` AUTO_INCREMENT=1;
TRUNCATE `log_url`;
ALTER TABLE `log_url` AUTO_INCREMENT=1;
TRUNCATE `log_url_info`;
ALTER TABLE `log_url_info` AUTO_INCREMENT=1;
TRUNCATE `log_visitor`;
ALTER TABLE `log_visitor` AUTO_INCREMENT=1;
TRUNCATE `report_event`;
ALTER TABLE `report_event` AUTO_INCREMENT=1;
TRUNCATE `log_summary_type`;
ALTER TABLE `log_summary_type` AUTO_INCREMENT=1;

编辑: 对于SQL调试,请打开/lib/Varien/Db/Adapter/Pdo/Mysql.php文件并查找protected $_debug。默认状态应为false,更改为true

之后,日志文件应该在var/debug/sql.txt

中可用

另外,请使用此stackoverflow ansver How do I print all the queries in Magento?

编辑2: 因此,这是处理销售物品税的文件。 app/code/core/Mage/Tax/Model/Observer/Observer.php

# Line 144 ( Magento 1.6 edition )
Mage::getModel('tax/sales_order_tax_item')->setData($data)->save();

正在调用sales_order_tax_item模型。

app/core/Mage/Tax/Model/Resource/Sales/Order/Tax/Itemp.php

# Line 51
public function getTaxItemsByItemId($item_id)
{
    $adapter = $this->_getReadAdapter();
    $select = $adapter->select()
        ->from(array('item' => $this->getTable('tax/sales_order_tax_item')), array('tax_id', 'tax_percent'))
        ->join(
            array('tax' => $this->getTable('tax/sales_order_tax')),
            'item.tax_id = tax.tax_id',
            array('title', 'percent', 'base_amount')
        )
        ->where('item_id = ?', $item_id);

    return $adapter->fetchAll($select);
}

这是从Observer调用的函数。那么,你现在可以做什么,只需在Observer或Function上添加断点并查看调试器输出。为什么两次调用这个函数!

答案 1 :(得分:2)

我发现了一个快速肮脏的黑客。我会尝试将此作为错误发布给开发人员。 打开文件app/code/core/Mmage/Tax/Model/Observer.php并转到第132行。 在该语句中有一个if($item)语句,将代码包装起来:

$define = 'FIX_'.$item->getId().'_'.$result->getTaxId();
if(!defined($define) || constant($define) != true) {
            // code
    define($define, true);
}

示例:

if (isset($ratesIdQuoteItemId[$id])) {
    foreach ($ratesIdQuoteItemId[$id] as $quoteItemId) {
        if ($quoteItemId['code'] == $tax['code']) {
            $item = $order->getItemByQuoteItemId($quoteItemId['id']);
            if ($item) {
                $define = 'FIX_'.$item->getId().'_'.$result->getTaxId();
                if(!defined($define) || constant($define) != true) {
                    $data = array(
                        'item_id'       => $item->getId(),
                        'tax_id'        => $result->getTaxId(),
                        'tax_percent'   => $quoteItemId['percent']
                    );
                    Mage::getModel('tax/sales_order_tax_item')->setData($data)->save();
                    define($define, true);
                }
            }
        }
    }
}

答案 2 :(得分:2)

请转到“管理员面板”中的Sales -> Tax -> Manage Tax Rules部分,并检查所有记录,以获取关系区域类的重复项。

在我的情况下,我在Checkout页面上对于具有Tax class“Taxable Goods”的产品有相同的错误,而在Tax Rules中我有两个这个类的条目,每个条目都有相同的税区。因此,系统尝试对产品适用两次相同的税。