php - 如何在错误 1062 上处理超过 1 个唯一索引?

标签 php mysql

好吧,我有一个包含 2 个唯一索引字段的表:emaildoc。当检测到重复的键插入时,我需要提醒用户。我可以使用:

...
catch(PDOException $e) {
    if($e->getCode() == 1062)
    ...
    }

但我不知道是哪个索引触发了这个错误。有办法查出来吗?

我在 Google 上发现您可以通过 getMessage() 函数来完成此操作,但似乎某些版本的 MySQL 返回类似 key 1 的内容,而其他版本则返回name_of_key,这使得它很难使用。我需要在插入之前进行选择吗?看起来很丑。

谢谢。

最佳答案

为了实现这种跨版本,您确实需要在 INSERT 之前放置一个 SELECT。 只要创建适当的锁,您就可以在插入之前安全地进行选择而不会发生竞争。

为获得最佳性能,请使用 InnoDB 和“SELECT ... FOR UPDATE”,因为它具有行级锁定功能。 SELECT ... FOR UPDATE 将锁定该行(如果它存在)或该行的“间隙”(如果不存在)。不要使用 SELECT ... LOCK IN SHARE MODE,因为这会创建读锁,而读锁必须升级为写锁,并且可能会发生死锁。

如果使用 MyISAM,请使用 LOCK TABLE 锁定表,以便只有一个线程可以访问它。 - http://dev.mysql.com/doc/refman/4.1/en/lock-tables.html

关于php - 如何在错误 1062 上处理超过 1 个唯一索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16555478/

相关文章:

javascript - Sequelize.js 一对多关系外键

php - 从我自己的 php 函数缓存 mysql

php - 显示 WooCommerce 产品库中的第一张图片

MySQL 表结构

Php Regex查找字符串是否为mysql select语句

php - 如何在 Laravel 中对指定的 Controller 操作进行过滤

PHP - 如果任何行结果匹配,如何更改 While 循环的结果

MySQL LIMIT 在 Prestashop 模块中不起作用

javascript - Ajax/PHP 登录没有反应

php - 让 php 程序运行几个小时