【问题标题】:SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1922-1' for key 'IDX_STOCK_PRODUCT'SQLSTATE [23000]:违反完整性约束:1062 键 'IDX_STOCK_PRODUCT' 的重复条目 '1922-1'
【发布时间】:2012-04-20 02:32:04
【问题描述】:

在创建产品时,在检索一段时间后的最后一步,Magento 出现以下错误-:

SQLSTATE[23000]:违反完整性约束:1062 键“IDX_STOCK_PRODUCT”的重复条目“1922-1”

我正在做的是,通过捕获产品 ID,我将它的条目放入自定义表中。我已从外部连接到 Magento 数据库。

令人惊讶的是,数据被插入到 Magento 的基表和自定义表中,但为什么在产品保存后它给我这个错误......?

我清除了缓存、浏览器 cookie。 同时删除 /var/cache、/var/session。 仍然给出错误。 有人可以提出解决方案吗?

【问题讨论】:

  • 此错误意味着您在同一个表中使用了两次相同的主键值。 IDX_STOCK_PRODUCT 中已有 ID 为 1922-1 的产品,并且查询正在尝试再次使用该 ID 保存新记录。
  • 那有什么解决办法?
  • 基本上不要使用重复 ID 保存数据。没有任何与此错误相关的代码示例,这是您将获得的最佳解决方案。

标签: magento constraints mysql-error-1062 duplicates


【解决方案1】:

该消息表示您正在使用属于 IDX_STOCK_PRODUCT 的相同列组合进行另一次插入,这些列组合被定义为 UNIQUE。如果是这样,它不允许输入相同的组合(它似乎由两个字段组成)两次。

如果您要插入记录,请确保您选择的是全新的记录 ID,或者记录 ID 和另一列的组合是唯一的。

没有详细的表结构和你的代码,我们很难猜出哪里出了问题。

【讨论】:

  • 你是对的 Radek,我正在我的自定义表中获取 SKU 和 entity_id。在我的自定义表中,我只有 4 列:No.,entity_id,SKU & timestamp....我应该在该表中放置什么约束?
【解决方案2】:

当您在自定义模块的观察者中更新产品时,很多时候会导致此错误,如下所示。

class [NAMESPACE]_[MODULE NAME]_Model_Observer
{
    /**
     * Flag to stop observer executing more than once
     *
     * @var static bool
     */
    static protected $_singletonFlag = false;

    public function saveProductData(Varien_Event_Observer $observer)
    {
        if (!self::$_singletonFlag) {
            self::$_singletonFlag = true;

            $product = $observer->getEvent()->getProduct();
             //do stuff to the $product object
            // $product->save();  // commenting out this line prevents the error
            $product->getResource()->save($product);
    }
} 

因此,每当您在模块的观察者中更新某些属性后保存产品时,请使用 $product->getResource()->save($product) 而不是 $product->save()

【讨论】:

    【解决方案3】:

    您可能忘记了自动增加 id 字段。

    【讨论】:

    • 本例中key是复合键,所以跟自增无关。
    【解决方案4】:

    我也遇到过这个问题。 我发现将表存储引擎从 MyISAM 更改为 Innodb 后,问题解决了。

    【讨论】:

    • 我也遇到了同样的问题,通过您的建议,我的问题得到了解决。
    【解决方案5】:

    您的列值已经在数据库表中 这意味着您的表格列是唯一的 你应该改变你的价值 然后再试一次

    【讨论】:

    • 为了清晰和内容,请编辑您的问题 1) 分解您对句子的回答 2) IDX_STOCK_PRODUCT 可能是复合键,而不是列。 3) 更新答案后,请向其中添加一些额外的有用信息,使其不仅仅是其他答案的重复或子集。
    • 对不起,我的英语很弱
    【解决方案6】:

    尝试将 FK 更改为 INDEX 而不是 UNIQUE。

    【讨论】:

      【解决方案7】:

      我刚刚添加了一个 @ 符号,它就开始工作了。像这样:@$product->save();

      【讨论】:

      • @ 的使用是一种不好的做法,必须不惜一切代价避免!
      • 正如维克多所说,应该避免使用@,因为它会抑制错误消息。详情可查看PHP Error Control here
      猜你喜欢
      • 2016-01-16
      • 2014-09-16
      • 2013-04-22
      • 2015-10-28
      • 1970-01-01
      • 2021-05-30
      • 2013-05-10
      • 2021-03-19
      • 1970-01-01
      相关资源
      最近更新 更多