约束命名的目的是什么

时间:2009-09-09 03:52:40

标签: sql database constraints naming

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

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

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有什么好处(如果有的话)?

EG。 替换:

    PRIMARY KEY(LoginName, OrderDateTime)

使用:

    CONSTRAINT Order_PK PRIMARY KEY(LoginName, OrderDateTime)

很抱歉,如果我的数据模型不是最好的,我是新手!

8 个答案:

答案 0 :(得分:87)

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

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

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

(3)如果支持你的代码(也就是DBA)的人在周日凌晨3点不得不浪费很多毫无意义的时间处理案例(1)或案例(2),他们很可能在确定代码来源的位置,并能够做出相应的反应。

答案 1 :(得分:8)

要确定将来的约束(例如,您希望以后删除它),它应该具有唯一的名称。如果您没有为其指定名称,数据库引擎可能会为您分配一个奇怪的名称(例如,包含随机内容以确保唯一性)。

答案 2 :(得分:3)

它使DBA满意,因此他们将您的架构定义放入生产数据库。

答案 3 :(得分:3)

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

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

约束名称对于用用户的语言显示适当的错误消息也非常有用,该错误消息提到哪个字段导致约束冲突,而不仅仅是将隐式错误消息从数据库服务器转发给用户。

how to do this with PostgreSQL and Java上查看我的答案。

答案 7 :(得分:0)

虽然 OP 的示例使用了一个永久表,但请记住,临时表上的命名约束的行为类似于永久表上的命名约束(即,您不能使用完全相同的代码处理多个会话,而不生成一个错误,因为约束的名称相同)。因为命名约束必须是唯一的,如果您绝对必须在临时表上命名约束,请尝试在它的末尾使用某种随机 GUID(如 SELECT NEWID() )以确保它将唯一命名会议。