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

问题描述 投票:0回答:5

我在表上有一个

UNIQUE, NON CLUSTERED
索引,当前使用 4 列作为索引。

我想创建一个更改脚本,它只能向该索引添加另一列。新的列类型是

varchar

数据库是SQL Server 2005。

sql-server-2005 indexing alter
5个回答
107
投票

您无法更改索引 - 您所能做的就是

  1. 删除旧索引(

    DROP INDEX (indexname) ON (tablename)
    )

  2. 重新创建新索引,其中包含附加列:

       CREATE UNIQUE NONCLUSTERED INDEX (indexname)
       ON dbo.YourTableName(columns to include)
    

SQL Server 中的

ALTER INDEX
语句(请参阅 docs)可用于更改现有索引的某些属性(存储属性等),但它不允许更改构成索引的列。


3
投票

如果要添加到索引的新列位于列列表的末尾 - 换句话说,如果旧索引的列列表是新索引的列列表的前缀 - 则已排序的行旧列仍将按新列排序。 在 Sybase SQL Server 以及可能较旧版本的 Microsoft SQL Server 中,有一个

with sorted_data
选项可让您声明行已排序。 但在MSSQL 2008 R2上似乎没有效果;该选项被接受但默默地被忽略。 无论如何,我认为该选项对于聚集索引最有用。

其他人提到

with drop_existing
,听起来不错,但仅适用于更昂贵的 MSSQL 版本。


2
投票

我可能晚了 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]

0
投票

我希望更改索引意味着首先我们必须删除索引并再次创建索引

语法:

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

0
投票

对于 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]
© www.soinside.com 2019 - 2024. All rights reserved.