约束命名的目的是什么

命名约束(唯一、主键、外键)的目的是什么?

假设我有一个使用自然键作为主键的表:

CREATE TABLE Order
(
LoginName        VARCHAR(50)    NOT NULL,
ProductName      VARCHAR(50)    NOT NULL,
NumberOrdered    INT            NOT NULL,
OrderDateTime    DATETIME       NOT NULL,
PRIMARY KEY(LoginName, OrderDateTime)
);

命名我的 PK 有什么好处(如果有的话) ?

更换:

    PRIMARY KEY(LoginName, OrderDateTime)

配合:

    CONSTRAINT Order_PK PRIMARY KEY(LoginName, OrderDateTime)

对不起,如果我的数据模型不是最好的,我是新手!

40169 次浏览

为了在将来识别约束(例如,您想在将来删除它) ,它应该有一个唯一的名称。如果您不为它指定一个名称,数据库引擎可能会为您指定一个奇怪的名称(例如,包含随机的内容以确保唯一性)。

它可以帮助某人快速了解约束在做什么,而不必查看实际的约束,因为名称可以提供您所需的所有信息。

因此,我知道它是主键、唯一键还是默认键,以及所涉及的表和可能涉及的列。

它使 DBA 满意,因此他们让您的模式定义进入生产数据库。

当您的代码随机地违反某个外键约束时,它肯定会节省调试时间来找出是哪个外键约束。命名它们可以大大简化插入和更新的调试。

下面是一些非常基本的原因。

(1)如果查询(插入、更新、删除)违反约束,SQL 将生成包含约束名称的错误消息。如果约束名称清晰且具有描述性,那么错误消息将更容易理解; 如果约束名称是随机的基于 guid 的名称,那么错误消息就不那么清晰了。特别是对于最终用户,他们会(好吧,可能)打电话给你,问你“ FK__B__B_COL1__75435199”是什么意思。

(2)如果一个约束在将来需要修改(是的,它发生了) ,如果你不知道它的名字,那么就很难做到这一点。(ALTER TABLE MyTable drop CONSTRINT um...)如果您“从头”创建数据库的多个实例并使用系统生成的默认名称,那么将永远不会有两个名称匹配。

(3)如果那些支持你的代码的人(又名 DBA)在周日凌晨3点浪费了大量毫无意义的时间处理 case (1)或 case (2) ,他们很可能能够识别代码的来源并做出相应的反应。

通过正确命名所有约束,可以快速将特定约束与数据模型关联。这给了我们两个真正的优势:

  1. 我们可以快速识别和修复任何错误。
  2. 我们可以可靠地修改或删除约束。

通过命名约束,可以区分违反约束的情况。这不仅对管理员和开发人员有用,而且您的程序还可以使用约束名称。这比尝试解析错误消息要健壮得多。通过使用约束名称,程序可以根据违反约束的情况做出不同的反应。

约束名称对于用用户语言显示适当的错误消息也非常有用,它可以提示哪个字段导致了约束违反,而不仅仅是将一个隐晦的错误消息从数据库服务器转发给用户。

如何使用 PostgreSQL 和 Java 做到这一点上看到我的答案。

当 OP 的例子使用永久表时,只要记住临时表上的命名约束与永久表上的命名约束行为相似(例如,你不能用处理临时表的完全相同的代码进行多个会话,而不会产生错误,因为这些约束的名称是相同的)。因为命名约束必须是唯一的,所以如果绝对必须在临时表上命名约束,请尝试在约束的末尾使用某种随机 GUID (比如 SELECT NEWID()) ,以确保它在不同会话之间进行唯一命名。

命名约束的另一个好的理由是,如果在数据库模式上使用版本控制。在这种情况下,如果必须使用默认的数据库命名(在我的例子中是 SQL Server)删除和重新创建约束,那么您将看到提交的版本和工作副本之间的差异,因为它将有一个新生成的名称。为约束提供显式名称可以避免将此标记为更改。