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