好吧,我有一个包含 2 个唯一索引字段的表:email
和 doc
。当检测到重复的键插入时,我需要提醒用户。我可以使用:
...
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/