2

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

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

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

我在谷歌上发现你可以通过这个getMessage()函数来做到这一点,但似乎某些版本的 MySQL 返回类似的东西key 1,而其他版本则返回name_of_key,这使得这很难使用。我需要在插入之前进行选择吗?它看起来很丑。

谢谢。

4

1 回答 1

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

于 2013-05-17T18:29:30.197 回答