我在表上有一个
UNIQUE, NON CLUSTERED
索引,当前使用 4 列作为索引。
我想创建一个更改脚本,它只能向该索引添加另一列。新的列类型是
varchar
。
数据库是SQL Server 2005。
您无法更改索引 - 您所能做的就是
删除旧索引(
DROP INDEX (indexname) ON (tablename)
)
重新创建新索引,其中包含附加列:
CREATE UNIQUE NONCLUSTERED INDEX (indexname)
ON dbo.YourTableName(columns to include)
SQL Server 中的
ALTER INDEX
语句(请参阅 docs)可用于更改现有索引的某些属性(存储属性等),但它不允许更改构成索引的列。
如果要添加到索引的新列位于列列表的末尾 - 换句话说,如果旧索引的列列表是新索引的列列表的前缀 - 则已排序的行旧列仍将按新列排序。 在 Sybase SQL Server 以及可能较旧版本的 Microsoft SQL Server 中,有一个
with sorted_data
选项可让您声明行已排序。 但在MSSQL 2008 R2上似乎没有效果;该选项被接受但默默地被忽略。 无论如何,我认为该选项对于聚集索引最有用。
其他人提到
with drop_existing
,听起来不错,但仅适用于更昂贵的 MSSQL 版本。
我可能晚了 9 年,但这就是我的做法(这会删除现有索引并使用列表中的列创建新索引):
CREATE UNIQUE NONCLUSTERED INDEX [INDEX_NAME] ON [TABLE_NAME]
(
[COLUMN1] DESC,
[COLUMN2] ASC
)
WITH
(
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = ON,
DROP_EXISTING = ON,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
)
ON [PRIMARY]
我希望更改索引意味着首先我们必须删除索引并再次创建索引
语法:
if exists
(
select * from sys.indexes where name ='ix_name'
)
BEGIN
DROP INDEX Table.index name
END
IF NOT EXISTS
(
select * from sys.indexes where name ='ix_name'
)
BEGIN
CREATE NONCLUSTERED INDEX
ON TABLENAME
(
COLUMN1,
COLUMN2,
COLUMN3,
COLUMN4,
--Whatever column u want to add
)
end
go
对于 UNIQUE 键,DROP 可能不适用于上述任何解决方案,因此我添加了此选项。
从表中删除索引。在表列表中,对于表,对于键,找到键,右键单击,选择删除并批准删除。
然后执行创建 SQL,确保 DROP_EXISTING = OFF(因为它不再存在)。
CREATE UNIQUE NONCLUSTERED INDEX [INDEX_NAME] ON [TABLE_NAME]
(
[COLUMN1] DESC,
[COLUMN2] ASC
)
WITH
(
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = ON,
DROP_EXISTING = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
)
ON [PRIMARY]