一尘不染

更改列数据类型时保留SQL索引

sql

我有一个smalldatetime列,需要将其更改为datetime列。这将是安装过程的一部分,因此它不能是手动过程。不幸的是,该列具有一些索引,并且对它的约束不是非null。索引与性能有关,仅需要使用新数据类型保留索引。是否可以写一条语句使我在保留相关信息的同时仍更改列数据类型?如果是这样,该怎么办?


阅读 150

收藏
2021-03-10

共1个答案

一尘不染

您无法使用适当的索引,唯一约束,外键约束或检查约束将数据类型从smalldatetime更改为datetime。您必须先将它们全部删除,然后再更改类型。然后:

alter table T alter column TestDate datetime not null

然后重新创建仍然适用的约束和索引。


生成放置和创建的一些不同方法:

1)如果为所有索引和约束都指定了明确的名称,则安装程序可以在每种环境(开发,测试,用户接受测试,性能测试等,生产环境)中运行静态脚本。

要生成此显式脚本,您可以:a)使用SSMS(或与SQL Server
2000,企业管理器一起)编写create和drop语句的脚本。b)在您的源代码存储库中进行工作,以发现依赖对象的名称和定义,并将适当的静态脚本放在一起。c)尝试运行alter语句。看看它失败了。查找定义并手写放置并创建。(个人而言,这对于编写drop非常有用,而不是那么擅长创建。)

2)如果未为所有索引和约束都指定显式名称,则安装程序将必须在数据字典中查询适当的名称,并使用动态SQL以正确的顺序运行drop,然后再使用alter
column语句和然后,以正确的顺序在alter列之后创建。

如果您知道没有约束,而只有索引,这将变得更加简单。

可能有些工具或库已经知道如何执行此操作。

同样,如果这是一个打包的应用程序,则可能无法确保本地DBA尚未添加索引。

注意:如果存在唯一约束,它将建立一个索引,您将无法使用DROP INDEX删除该索引。

2021-03-10