我应该用php检查一个独特的约束吗?

时间:2013-07-16 12:13:55

标签: php database

也许这个问题已被提出,但我真的不知道如何搜索它:

我有postgres-table“customers”,每个客户都有自己独特的名字。 为了实现这一点,我在本专栏中添加了一个唯一约束。

我用php访问该表。

当用户现在尝试使用已经采用的名称创建新客户时,数据库会显示“Integrity Constraint Violation”,并且php会抛出错误。

我想要做的是在html-input-field中显示错误:发生这种情况时“已经采取了客户名称”。

我的问题是我应该怎么做。

我是否应该捕获PDO-Exception,检查错误代码是否为“UNIQUE VIOLATION”,然后根据Exception-Message显示消息,或者在我尝试之前是否应该使用附加语句检查重复的名称插入新行?

什么是更好的做法?进一步发表sql语句,或者捕获和分析错误代码。

修改 我正在使用事务,我正在捕获任何异常以便回滚。 问题是,如果我应该过滤掉唯一违规,那么它们就不会导致回滚。

EDIT2: 如果我正在使用异常方法,我将不得不分析异常消息,以确保unique-constraint真正属于“name”列。

这是我从异常中得到的一切:

["23505",7,"FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint <customers_name_unique>\nDETAIL: Schlüssel <(name)=(test)> existiert bereits."]

获取有关列的信息的唯一方法是检查“customers_name_unique”是否存在(它是唯一约束的名称)。

但是你也可以看到,消息是德语的,所以输出取决于系统/可能会改变。

5 个答案:

答案 0 :(得分:5)

你应该抓住PDO例外。

让数据库失败的速度要快于查找并查看记录是否已存在。

这也使应用程序“不太了解”数据库中的业务逻辑。当您告诉数据库有关唯一的索引时,它实际上是一个业务逻辑,并且由于数据库正在处理该特定逻辑,因此最好跳过其他层(应用程序)中的相同检查。

此外,当数据库层处理异常时,您可以避免竞争条件。如果您的应用程序正在检查一致性,那么在第一个应用程序检查到它可用后,您可能会冒另一个用户添加相同记录的风险。

答案 1 :(得分:2)

问题并不属于这里,但我会回答你。

例外情况是异常发生的情况。这意味着您不应该使用它们来处理可能经常发生的情况。如果你这样做,那就像GOTO代码。更好的解决方案是检查是否有任何重复的行。但是,具有异常的解决方案更容易,因此您需要决定是否需要某些工作,或者您是否希望有一些可以按原样编写的内容。

答案 2 :(得分:1)

我会抓住异常,因为(感谢并发)无论如何都会发生,即使您事先检查了额外的查询。

答案 3 :(得分:0)

错误很糟糕,我宁愿在添加之前检查名称是否不存在。那么你仍然应该检查插入是否没有错误,以避免并发脚本试图插入相同名称时的情况(检查存在和插入之间有一点时间,因为它不是事务)。

答案 4 :(得分:0)

在SAVE上检查是否存在(通过简单字段,在您的情况下:Constraint列)。 如果是肯定的 - 向用户显示有关重复的通知。但是不要强制DB服务器返回异常。