【问题标题】:Magento Order saving error: Integrity constraint violationMagento 订单保存错误:违反完整性约束
【发布时间】:2012-12-04 21:55:27
【问题描述】:

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

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

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

$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。有人知道如何解决吗?

【问题讨论】:

  • 最近,你有没有安装任何扩展?
  • 是的,但没有什么应该影响税收的!不过我找到了解决办法。

标签: magento constraints integrity


【解决方案1】:

截断以下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 上添加一个断点并查看调试器输出。为什么要两次调用这个函数!

【讨论】:

  • 这样做了,没用!我以前也试过这个,但还是不行。有人列出了许多其他要清空的表,包括 sales_order_flat 表。但都没有奏效。还有其他建议吗?
  • 您是否尝试刷新缓存并重新索引产品和类别!从控制台而不是 magento 中删除 cache 目录。
  • 是的,我做了,我已经更新了问题,也许你可以帮助我编辑的位?
  • 好的,由于某种原因,您的第一次后没有更新日志文件,但是,stackoverflow 的答案肯定有帮助!我刚刚编辑了我的问题,你能再看看吗:)
  • 不知道为什么它被调用了两次,但是,由于您提供的 sql 调试,我找到了一个解决方案!我会把它作为一个新的答案发布。这是一种肮脏的技巧,但它确实有效。
【解决方案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);
                }
            }
        }
    }
}

【讨论】:

    【解决方案3】:

    请转到管理面板中的Sales -> Tax -> Manage Tax Rules 部分并检查那里的所有记录是否存在重复的关系区域类。

    在我的情况下,对于具有“应税商品”税类的产品,我在结帐页面上遇到了同样的错误,而在税收规则中,我有两个该类的条目,每个条目都具有相同的税区。所以系统尝试对产品征收两次相同的税。

    【讨论】:

    • 谢谢,这正是我的问题。由于之前安装的 Magento(我们的版本是 1.6.2.0)中的税收被打破了,由于税收系统发生了大量变化,这仅在 1.9 中出现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    相关资源
    最近更新 更多