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

maj*_*aja 5 php database

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

我有postgres表"客户",每个客户都有自己独特的名字.为了实现这一点,我在本专栏中添加了一个唯一约束.

我用php访问表.

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

我想要做的是在html-input-field中显示一个错误:当发生这种情况时,"已经采用了Customer-Name".

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

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

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

编辑: 我正在使用事务,我正在捕获任何异常以便回滚.问题是,如果我应该过滤掉Unique-violation,那么它们就不会导致回滚.

编辑2: 如果我使用异常方法,我将不得不分析异常消息,以确保唯一约束真正属于"名称"列.

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

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

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

但正如您所看到的,消息是德语,因此输出取决于系统/可能能够改变.

Sve*_*ore 5

您应该捕获PDO异常.

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

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

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