只需在 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)