gpt4 book ai didi

sql-server - 当索引依赖于该列而不重新创建索引时,如何将列从 null 更改为 not null?

转载 作者:太空狗 更新时间:2023-10-30 01:47:23 25 4
gpt4 key购买 nike

我有一个列 Column 声明为 NULL DEFAULT(GETUTCDATE()) 并且有一个包含该列的非聚集索引。我想将此列更改为 NOT NULL DEFAULT(GETUTCDATE()) 并且当我运行 ALTER TABLE ALTER COLUMN 时SQL Azure 服务声明它不能更改该列,因为有一个索引依赖于该列。

这是一个生产数据库,该表包含大约一千万条记录。所以我宁愿不删除并重新创建索引,因为这会降低数据库速度(尤其是创建索引可能需要几分钟)。

如何在不重新创建索引的情况下更改列?

最佳答案

不必更改表列即可强制执行 NOT NULL。相反,可以向表中添加一个新约束:

ALTER TABLE [Table] WITH CHECK
ADD CONSTRAINT [TableColumnNotNull] CHECK ([Column] Is NOT NULL);

这不会影响索引,但优化器会使用此约束来提高性能:

CREATE TABLE Test (ID bigint PRIMARY KEY, [Column] DATE NULL DEFAULT(GETUTCDATE()));
GO --< Create test table

CREATE NONCLUSTERED INDEX TestColumnIdx ON Test ([Column]);
GO --< Create the index

ALTER TABLE Test ALTER COLUMN [Column] DATE NOT NULL;
GO --< That won't work: the index 'TestColumnIdx' is dependent on column 'Column'

Select * From Test Where [Column] Is NULL;
GO --< Check the plan: it has "Index Seek (NonClustered)"

ALTER TABLE Test WITH CHECK ADD CONSTRAINT TestColumnNotNull CHECK ([Column] Is NOT NULL);
GO --< Add a "stand-alone" NOT NULL constraint

Select * From Test Where [Column] Is NULL;
GO --< Check the plan: it has "Constant Scan" now

DROP TABLE Test;
GO --< Clean-up

关于sql-server - 当索引依赖于该列而不重新创建索引时,如何将列从 null 更改为 not null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25503975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com