当前位置: 首页 > 知识库问答 >
问题:

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

党权
2023-03-14

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

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

我使用php访问该表。

当用户现在尝试创建一个新客户时,数据库会显示“完整性约束冲突”,php会抛出一个错误。

我想做的是在html输入字段中显示一个错误:“客户名称已被采用”。

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

我应该捕获PDO异常,检查错误代码是否为“唯一冲突”,然后根据异常消息显示消息,还是应该在尝试插入新行之前使用附加语句检查重复名称?

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

编辑:我正在使用事务,为了回滚,我正在捕获任何异常。问题是,我是否应该过滤掉唯一的违规行为,这样它们就不会导致回滚。

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

这是我从例外中得到的一切:

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

获取列信息的唯一方法是检查是否存在“customers\u name\u unique”(这是唯一约束的名称)。

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

共有3个答案

程禄
2023-03-14

我会捕获异常,因为(多亏了并发),即使您事先检查了一个额外的查询,这种情况也可能发生。

赫连宏伯
2023-03-14

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

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

安奇
2023-03-14

您应该捕获PDO异常。

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

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

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

 类似资料:
  • 问题内容: 我正在JPA中对userid列强制执行唯一性约束检查,这是对user表中的所有记录强制执行的。 我的要求是,特定组织内的用户ID必须唯一,而不是在所有组织中都唯一。 如何执行此类检查? 问题答案: 您可以为唯一约束指定多个字段,请尝试: 通过这样做,您的约束条件将检查userid和Organizationid的组合是否唯一。 最好的祝福,费边

  • 问题内容: 我想在我的MySQL表上添加一个唯一性约束。该表包含四列: 此约束必须检查对于new行,new和都未包含在或中。 例子 : 有没有办法定义这样的约束? 问题答案: 您可以通过触发器来做到这一点 注意: 由于您使用的MySQL版本缺少技巧,因此当找到具有相同地址的行时,违反对其中一列的约束。 这是 SQLFiddle 演示。取消注释最后一个插入语句之一,然后单击确定。这些插入不会成功。

  • 主要内容:在创建表时设置唯一约束,在修改表时添加唯一约束,删除唯一约束MySQL 唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。如果其中一条记录的 id 值为‘0001’,那么该表中就不能出现另一条记录的 id 值也为‘0001’。 唯一约束与主键约束相似的是它们都可以确保列的唯一性。不同的是,唯一约束在一个表中可有多个,并且设置唯一约束的列允许有空值,但

  • 主要内容:Oracle唯一约束语法,Oracle唯一约束例子在本教程中,您将学习如何使用Oracle唯一约束来确保包含在一列或几列中的数据在表中的行之间是唯一的。 Oracle唯一约束语法 一个唯一的约束是一个完整性约束,它确保存储在一列或一组列中的数据在表中的行之间是唯一的。 通常,在使用内联约束语法创建表时,将唯一约束应用于列,如下所示: 此唯一约束指定中的值在整个表中是唯一的。也可以使用外线()约束语法来定义一个唯一的约束: 可以通过使用子句和约束名

  • 当我试图创建第二个表时,我遇到了以下错误,但我不知道为什么。对于表patente,我希望能够将(idfunconario,titulo)作为主键。正如其他主题中所建议的,我已经尝试将唯一约束设置为“唯一(IDFunconario,titulo)”。 消息错误: 错误:没有唯一的约束匹配引用表"public acao"的给定键SQL状态:42830 我在64位的Windows 8.1上使用Postg

  • 以下两者之间有区别吗: 以及: 在这两种情况下,名称是否唯一?索引唯一时意味着什么? 编辑:Postgres是唯一的约束,而索引没有回答我的问题。它考虑了FK的情况。我的问题与FK无关。我只想知道在这个例子中,这两个操作是否等价,其中不涉及FK。