命名约束(唯一,主键,外键)的目的是什么?
假设我有一个使用自然键作为主键的表:
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)
很抱歉,如果我的数据模型不是最好的,我是新手!
答案 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)
通过正确命名所有约束,您可以快速将特定约束与我们的数据模型相关联。这给了我们两个真正的优势:
答案 6 :(得分:0)
通过命名约束,您可以区分违反约束的情况。这不仅对管理员和开发人员有用,而且您的程序还可以使用约束名称。这比尝试分析错误消息要强大得多。通过使用约束名称,您的程序可以根据违反的约束做出不同的反应。
约束名称对于用用户的语言显示适当的错误消息也非常有用,该错误消息提到哪个字段导致约束冲突,而不仅仅是将隐式错误消息从数据库服务器转发给用户。
答案 7 :(得分:0)
虽然 OP 的示例使用了一个永久表,但请记住,临时表上的命名约束的行为类似于永久表上的命名约束(即,您不能使用完全相同的代码处理多个会话,而不生成一个错误,因为约束的名称相同)。因为命名约束必须是唯一的,如果您绝对必须在临时表上命名约束,请尝试在它的末尾使用某种随机 GUID(如 SELECT NEWID()
)以确保它将唯一命名会议。