SQL Server:如何编写alter index语句以将列添加到唯一索引?

时间:2012-03-19 07:53:40

标签: sql-server-2005 indexing alter

我在表上有一个UNIQUE, NON CLUSTERED索引,当前正在使用4列作为索引。

我想创建一个只能向该索引添加另一列的alter脚本。新列类型为varchar

数据库是SQL Server 2005.

提前致谢。

4 个答案:

答案 0 :(得分:76)

您无法改变索引 - 您所能做的只是

  1. 删除旧索引(DROP INDEX (indexname) ON (tablename)
  2. 使用其中的附加列重新创建新索引:

      CREATE UNIQUE NONCLUSTERED INDEX (indexname)
      ON dbo.YourTableName(columns to include)
    
  3. 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