好吧,我有一个包含2个唯一索引字段的表:email
和doc
。我需要在检测到重复键插入时提醒用户。我可以使用:
...
catch(PDOException $e) {
if($e->getCode() == 1062)
...
}
但我不知道哪个索引触发了这个错误。有没有办法找出来?
我在Google上发现你可以通过getMessage()
函数来实现,但似乎某些版本的MySQL返回key 1
之类的内容,而其他版本则返回name_of_key
,这使得难以合作。插入之前是否需要选择?它看起来很难看。
感谢。
答案 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