在 symfony2 中处理 1062 重复条目异常

Posted

技术标签:

【中文标题】在 symfony2 中处理 1062 重复条目异常【英文标题】:Handle 1062 Duplicate entry Exception in symfony2 【发布时间】:2015-07-30 14:33:09 【问题描述】:

我有一个 PDO 异常:

[PDO异常] SQLSTATE [23000]:完整性约束违规:1062 键 'UNIQ_88A3CEF5FB7BD549' 的重复条目 '0_L525_H132_A000_P624_M600'

这样脚本会在异常发生后继续执行?

实际上,我的实体看起来像:

/** @ORM\Table(indexes=@Index(columns="Soundex"))
 * @ORM\Entity
 * @UniqueEntity("Soundex")
 */
class SoundexData

    /**
     * @var string
     *
     * @ORM\Column(name="Soundex", type="string", length=255, nullable=true,unique=true)
     */
    private $soundex;

我尝试使用以下方法导入数据:

try 
    $em->persist($data);
    $em->flush();

catch(\Doctrine\DBAL\DBALException $e) 

    // handle exception

为了避免破坏脚本并在异常发生后继续,我坚持:(

那么我该如何处理呢?

所有这一切的原因是,我不想在我的数据库中有双重条目,所以我认为忽略双重条目会更容易,而不是检查每个数据集是否已经存在于数据库中(没有 mysql 请求最快的请求;))

【问题讨论】:

只需将\Doctrine\DBAL\DBALException 替换为\PDOException ? 不,这行不通。当我使用 \Doctrine\DBAL\DBALException 时,我收到一条“entityManager 已关闭消息。当我使用 PDO 时...我收到上面描述的异常 当抛出异常时,实体管理器会自动关闭并基本上变得无法使用。这是设计使然。有太多事情可能出错,无法继续尝试。您基本上需要先检查或下拉并使用 dbal 连接对象而不是 ORM 实体管理器。 【参考方案1】:

您应该改为捕获 PDOException:

try 
    $em->persist($data);
    $em->flush();
 catch(\PDOException $e) 
    // handle exception

【讨论】:

IMO 你不应该知道 ORM 使用 PDO。

以上是关于在 symfony2 中处理 1062 重复条目异常的主要内容,如果未能解决你的问题,请参考以下文章

#1062 - 键 'PRIMARY' 的重复条目 '19'

[23000][1062] 键 'PRIMARY' 的重复条目 '0'

错误代码:1062。重复条目 'PRIMARY'

MySQL PHPMyAdmin 错误 #1062 - 键 'PRIMARY' 的重复条目 '0'

“违反完整性约束:1062 重复条目”-但没有重复行

IntegrityError:(1062,“密钥 2 的重复条目 '3-add_author'”)