只需在 SQL Server 的列上设置 DEFAULT 与设置 CONSTRAINT

Posted

技术标签:

【中文标题】只需在 SQL Server 的列上设置 DEFAULT 与设置 CONSTRAINT【英文标题】:Simply setting a DEFAULT vs setting a CONSTRAINT on a column in SQL Server 【发布时间】:2018-04-05 13:10:30 【问题描述】:

我几乎是 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

【问题讨论】:

它们是同一个东西——DEFAULT 是一个CONSTRAINT,两者之间的唯一区别是您在第二个中明确命名了约束DF_DatiSetup_RecDataW,但不是第一个。你也可以通过 CREATE TABLE dbo.Data (RecDataW DATETIME NOT NULL DEFAULT GETDATE()) 【参考方案1】:

区别在于分配一个明确的、已知的名称。表格

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

将创建一个带有名称的默认名称,但该名称是系统生成的,并且在脚本部署到的每个环境中都会有所不同。 (Dev、test、UAT、staging、production、Bob 的桌面等)如果您需要更改默认设置,这可能是个问题。

表格

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

明确命名默认值,以便名称在所有环境中都是统一的。因此,有一种方法可以在所有环境中以可重复的方式引用默认值(如果需要删除、更改等)。

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于只需在 SQL Server 的列上设置 DEFAULT 与设置 CONSTRAINT的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:查询应用在 where 子句中,包含 Json 对象的列上的 IS NOT Null 需要更多时间

DateTime 列上的 Mono InvalidOperationException (SQL Server)

在 SQL Server 中的计算列上运行总计

sqlserver表的唯一键约束怎么设置?

始终加密 - SQL Server 2016 如何在加密列上使用用户案例语句

sql 优化