如何从表中删除索引键

时间:2011-08-18 13:30:19

标签: sql sql-server-2005 indexing

我正在使用sql server 2005/2008,我有一张表,它的PK(rec_index)也被编入索引。

CREATE TABLE [dbo].[MyTable] 
(
    [rec_index] INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
    file_desc nvarchar(50),
    is_modified bit
)

但遗憾的是,我的数据库中已有一个这样的表,其中没有索引创建了O。

我如何询问已经索引的表是否无效,否则添加索引?我不能放弃它而不是重新创建它,因为我将丢失数据。

我正在寻找像"if not exists <index for rec_index> do <create index for rec_index>"

这样的东西

2 个答案:

答案 0 :(得分:0)

可能是这样的:

IF NOT EXISTS ( select * 
                  from sys.objects 
                 where parent_object_id = object_id('MyTable') 
                   and type = 'PK' )

do <create index for rec_index>

答案 1 :(得分:0)

这里有很多可能性,我不确定你打的是哪种情况,以及你想在每种情况下做什么:

USE [tempdb];

-- table with a clustered PK
CREATE TABLE dbo.TableA(rec_index INT IDENTITY(1,1) PRIMARY KEY CLUSTERED);

-- table with non-clustered PK
CREATE TABLE dbo.TableB(rec_index INT IDENTITY(1,1) PRIMARY KEY NONCLUSTERED);

-- table with no PK, no indexes
CREATE TABLE dbo.TableC(rec_index INT IDENTITY(1,1));

-- table with no PK, non-clustered non-unique index
CREATE TABLE dbo.TableD(rec_index INT IDENTITY(1,1));
CREATE INDEX d ON dbo.TableD(rec_index);

-- table with no PK, clustered non-unique index
CREATE TABLE dbo.TableE(rec_index INT IDENTITY(1,1));
CREATE CLUSTERED INDEX e ON dbo.TableE(rec_index);

-- table with no PK, non-clustered unique index
CREATE TABLE dbo.TableF(rec_index INT IDENTITY(1,1));
CREATE UNIQUE INDEX f ON dbo.TableF(rec_index);

-- table with no PK, clustered unique index
CREATE TABLE dbo.TableG(rec_index INT IDENTITY(1,1));
CREATE UNIQUE CLUSTERED INDEX g ON dbo.TableG(rec_index);

-- table with unique clustered index, but PK on different column
CREATE TABLE dbo.TableH(rec_index INT IDENTITY(1,1),
     b INT PRIMARY KEY NONCLUSTERED);
CREATE UNIQUE CLUSTERED INDEX h ON dbo.TableH(rec_index);

GO
DROP TABLE dbo.TableA,dbo.TableB,dbo.TableC,dbo.TableD,
           dbo.TableE,dbo.TableF,dbo.TableG,dbo.TableH;
GO

您当然可以从系统元数据中对每个场景执行检查,并做出相应的反应。但是你需要帮助我们缩小“没有索引”的意思。