在SQL Server中,仅设置默认值与在列上设置约束有何区别?

9

我在SQL Server编程方面几乎是新手。今天我发现了这两种不同的策略来定义列的默认值,我想问问专家它们之间的区别。

给定这个表:

CREATE TABLE [dbo].[Data] 
(
    [RecDataW] [datetime] NULL
)

代码段 #1:

ALTER TABLE [dbo].[DatiSetup] 
    ADD DEFAULT (GETDATE()) FOR [RecDataW]
GO

片段 #2:

ALTER TABLE [dbo].[DatiSetup] 
    ADD CONSTRAINT [DF_DatiSetup_RecDataW] DEFAULT (GETDATE()) FOR [RecDataW]
GO

3
它们是同一件事 - DEFAULT 是一个 CONSTRAINT,两者之间唯一的区别是在第二个中你显式地命名了约束为 DF_DatiSetup_RecDataW,而在第一个中没有。你也可以使用简化形式来创建表格,如 CREATE TABLE dbo.Data (RecDataW DATETIME NOT NULL DEFAULT GETDATE()) - Siyual
3个回答

16
指的是明确、已知名称的分配差异。这种形式
ALTER TABLE [dbo].[DatiSetup] 
    ADD DEFAULT (GETDATE()) FOR [RecDataW]

会创建一个默认值,但该默认值的名称是系统生成的,在脚本部署到每个环境(Dev、test、UAT、staging、production、Bob's desktop等)时都会不同。如果您需要更改默认值,则可能会遇到问题。

这个表单

ALTER TABLE [dbo].[DatiSetup] 
   ADD CONSTRAINT [DF_DatiSetup_RecDataW] DEFAULT (GETDATE()) FOR [RecDataW]

明确指定默认值的名称,以使名称在所有环境中保持统一。因此,如果需要删除、更改等操作默认值,就有了一种在所有环境中能够重复引用默认值的方式。

在我过去几年工作的地方,标准做法是始终对约束命名。[有时这是标准,是因为我有权力将其设为标准。有时其他人已经将其设为标准。]

此外,还有一些使用 SQL 进行开发和部署的方法,后续环境中使用第一个系统生成的名称。使用的工具会明确命名下游约束以匹配。即便如此,请对所有约束进行命名。


0

就像Siyual在他的评论中所说,这些是相同的东西。默认值为您创建了一个约束条件。使用默认值创建约束条件是您创建的命名约束条件。您可以在此处找到有关默认约束条件的文档


0

约束将允许您命名,而默认情况下将为您随机创建名称。一个很好的例子是当您在多租户环境中工作时。如果您有一个应用程序,其中有许多数据库副本(例如每个租户一个),如果默认值没有明确命名,则将来很难进行更改/维护/部署。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接