我应该用php检查一个唯一的约束吗


Should I check a unique constraint with php?

也许这个问题已经被问过了,但我真的不知道如何搜索:

我有postgres表"customers",每个客户都有自己唯一的名称。为了实现这一点,我在此列中添加了一个唯一的约束。

我使用php访问该表。

当用户现在尝试创建一个新客户时,数据库会显示"Integrity Constraint Violation",php会抛出一个错误。

当这种情况发生时,我想做的是在html输入字段中显示一个错误:"客户名称已被占用"。

我的问题是我该怎么做。

我应该捕捉PDO异常,检查错误代码是否为"UNIQUE VIOLATION",然后根据异常消息显示一条消息,还是应该在尝试插入新行之前用一条额外的语句检查重复的名称?

什么是更好的实践?生成进一步的sql语句,或者捕获并分析错误代码。

编辑:我正在使用事务,并且我正在捕获任何异常以便回滚。问题是,我是否应该过滤掉Unique违规,这样它们就不会导致回滚。

第2版:如果我使用异常方法,我必须分析异常消息,以确保唯一约束真正属于"name"列。

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

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

获取列信息的唯一方法是检查"customer_name_unique"是否存在(它是唯一约束的名称)。

但您也可以看到,消息是德语的,因此输出取决于系统/可能会更改。

您应该捕获PDO异常。

让数据库失败比查找并查看记录是否已经存在更快。

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

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

这个问题其实不属于这里,但我会回答你的。

例外情况是指发生异常情况的情况。这意味着你们不应该用它们来处理可能经常发生的情况。如果你这样做,那么它就像GOTO代码。更好的解决方案是预先检查是否存在任何重复行。然而,有异常的解决方案更容易,因此您需要决定是希望某个东西正常工作,还是希望将某个东西按原样编写。

我会捕捉到异常,因为(由于并发性)无论如何都可能发生,即使事先使用额外的查询进行检查也是如此。

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

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