简单地设置 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
我几乎是 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