我在表上有一个UNIQUE, NON CLUSTERED
索引,当前正在使用4列作为索引。
我想创建一个只能向该索引添加另一列的alter脚本。新列类型为varchar
。
数据库是SQL Server 2005.
提前致谢。
答案 0 :(得分:76)
您无法改变索引 - 您所能做的只是
DROP INDEX (indexname) ON (tablename)
)使用其中的附加列重新创建新索引:
CREATE UNIQUE NONCLUSTERED INDEX (indexname)
ON dbo.YourTableName(columns to include)
SQL Server中的ALTER INDEX
语句可用于更改现有索引的某些属性(存储属性等),但不允许更改构成索引的列。
答案 1 :(得分:3)
如果要添加到索引的新列位于列列表的末尾 - 换句话说,如果旧索引的列列表是新索引的列列表的前缀 - 那么行按旧列排序仍将按新列排序。在Sybase SQL Server和可能是旧版本的Microsoft SQL Server中,有一个with sorted_data
选项可以让您声明行已经排序。但在MSSQL 2008 R2上似乎没有任何影响;该选项被接受但默默无视。在任何情况下,我认为该选项对聚簇索引最有用。
其他人提到with drop_existing
,这听起来不错,但仅适用于更昂贵的MSSQL版本。
答案 2 :(得分:0)
我可能晚了 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]
答案 3 :(得分:-1)
我希望alter index意味着首先我们必须删除索引并重新创建索引
语法:
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