如何在错误1062上处理多个唯一索引?

时间:2013-05-15 01:46:24

标签: php mysql

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

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

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

我在Google上发现你可以通过getMessage()函数来实现,但似乎某些版本的MySQL返回key 1之类的内容,而其他版本则返回name_of_key,这使得难以合作。插入之前是否需要选择?它看起来很难看。

感谢。

1 个答案:

答案 0 :(得分:0)

为了做这个跨版本,你真的需要在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