简单地设置 DEFAULT 与在 SQL 服务器中的列上设置 CONSTRAINT

Simply setting a DEFAULT vs setting a CONSTRAINT on a column in SQL Server

我几乎是 SQL 服务器编程的新手。今天我发现了这两种不同的策略来定义一个列的默认值,我想请教专家他们之间的区别。

鉴于此 table:

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

正如Siyual在他的评论中所说,这些是一回事。默认值是为您创建约束。创建具有默认值的约束就是创建您命名的约束。您可以找到 documentation on default constraints here.

不同之处在于分配一个明确的已知名称。形式

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

将创建一个带有名称的默认值,但该名称是系统生成的,并且在脚本部署到的每个环境中都不同。 (开发、测试、UAT、暂存、生产、Bob 的桌面等)如果您需要更改默认值,这可能是个问题。

形式

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

显式命名默认,这样名字在所有环境下都是统一的。因此,如果需要删除、更改等,可以在所有环境中以可重复的方式引用默认值。

我这几年工作的地方的标准是总是名字约束。 [有时这就是标准,因为我有权将其定为标准。有时其他人已经将其设为标准。]

此外,还有一些开发和部署方法 SQL,其中第一个系统生成的名称用于后续环境。使用的工具明确命名约束下游以匹配。 Red Gate Sql Source和Sql Compare可以做到这一点。即便如此,请命名所有约束。

约束将允许您命名,而默认设置将为您随机创建名称。一个很好的例子就是当您在多租户环境中工作时。如果您的应用程序有多个数据库副本(例如每个租户一个),如果默认值未明确命名

,将来将很难制作 changes/maintain/deploy