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

时间:2017-10-24 16:27:09

标签: sql sql-server default-value

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

鉴于此表:

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

Snippet#1:

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

Snippet#2:

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

3 个答案:

答案 0 :(得分:3)

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

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做到这一点。即便如此,请列出所有约束。

答案 1 :(得分:0)

Siyual在评论中说,这些都是一回事。默认值是为您创建约束。使用默认值创建约束是您创建您命名的约束。您可以找到documentation on default constraints here

答案 2 :(得分:0)

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