我有一个非常大的表,并添加了一个带有 DEFAULT 的新 NOT NULL 列。在 DWH 环境中并不罕见。这是一个在线操作,运行速度非常快,并将默认值存储在表元数据中,正如我们可以在那里了解到的那样。它工作得很好,SELECTs 返回一个默认值。一段时间后,我决定将默认值更改为不同的值。而且看起来我们无法通过更改默认值来实现它。我的意思是,我们可以放弃旧的默认值并创建新的默认值,但所有 SELECTS 都会显示旧的默认值。我会尽量避免大量更新,因为它们又长又痛苦。可能吗?
--DROP TABLE #t
CREATE TABLE #t
(
c1 int not null
)
INSERT INTO #t VALUES (1)
ALTER TABLE #t ADD c2 int not null CONSTRAINT t#c2def default -1
ALTER TABLE #t DROP CONSTRAINT t#c2def
SELECT * FROM #t
-- c2 = -1
ALTER TABLE #t ADD CONSTRAINT t#c2def DEFAULT -2 FOR c2
SELECT * FROM #t
-- still c2 = -1
更一般地说,我们是否有关于此功能如何工作的更多详细信息?我希望现有的未更新页面应该显示新的默认值。这就是我对“默认值仅存储在表的元数据中,并根据需要查找该值”的理解方式。不幸的是,它不是这样工作的。所有行都显示旧的默认值。我正在 SQL Server 2014 上检查它。
我在这里找到了答案。默认值与默认约束不同。它是在我们创建第一个默认约束时创建的,不能更改。
所以,回答我的问题 - 不,这是不可能的。我们无法更改列的默认值。这种魔法只起作用一次。在此之后,我们应该执行常规 DML 来更改行中的值。