PDO如何在MySQL数据库中获取INSERT的重复键列名?

时间:2012-01-12 14:50:39

标签: php insert pdo duplicates

如果以前曾问过这个问题,我很抱歉,但我找不到答案了很长一段时间。

问题是尝试在具有多个UNIQUE键的MySQL表中插入行时。如果我们将下表作为参考:

----------------------------------------
|   id   | username |      email       | 
----------------------------------------
|    1   | myuser   | test@test.com    |
----------------------------------------

用户名电子邮件都是UNIQUE键。如果我运行查询以插入带有username ='myuser'的新行,我将在重复输入时收到1062错误,并在消息中显示一些文本,表示ID为3的密钥重复。像这样:

array(3) {
  [0]=>
  string(5) "23000"
  [1]=>
  int(1062)
  [2]=>
  string(34) "Duplicate entry 'myuser' for key 3"
}

PDO中是否有办法获取重复列的名称,以便我可以向用户显示他因错误而需要更改哪个字段?

因为案例是两个字段都可以复制,或者只是第一个/第二个字段,我需要告诉用户确切的字段。

我想解析文本消息并硬编码密钥的ID,但有人可以明天更改数据库中的密钥,删除密钥或添加新密钥,并且密钥编号似乎不是可靠的来源信息。

或许最好的选择是在INSERT之前选择所有作为键检查它们的值?

谢谢!

2 个答案:

答案 0 :(得分:4)

不,没有办法获得更好的错误消息,其中包含失败的表的信息。您在数组“密钥3的重复条目'myuser'中看到的消息几乎就是您想要的信息。数字3实际上是您所做的索引的名称。您可以更改为更有意义的内容,例如“用户名”,并获得更好的错误消息,您可以转发给用户。如果要制作自定义错误消息,则必须从该消息中提取所需信息。

答案 1 :(得分:1)

同意,没有办法获得有关UNIQUE错误的有用报告。真正最好的解决方案是在INSERT之前调用SELECT并通过自我方式处理结果。它会对性能产生影响,但大多数应用程序的插入次数较少,因此您可能会放弃它。