2011-08-18 95 views
0

我正在使用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 
) 

不幸的是,我已经在我的数据库中有这样一个表,这是在没有索引的情况下创建的。

我该怎么问,如果表已经索引什么也不做,否则添加一个索引?我不能放弃它,因为我会丢失数据,所以不能重新创建它。

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

+0

1)是的,它的PRIMARY KEY被索引。当它被声明为PK时,它会自动编制索引,2)通过删除索引,不会丢失实际数据,尽管索引重建可能很耗时,所以您可能仍然希望避免它。你真的想/需要这个单独的索引吗? –

+0

*'不过不幸的是,我已经在我的数据库中创建了一个没有索引的类似于这样的表格。'* - 您的意思是您没有在该表格的脚本中的'PRIMARY KEY'之后指定'CLUSTERED'?或者,也许你没有指定'PRIMARY KEY'? –

+0

如果你发现一个PK并且它没有聚集,你想要做什么?或者聚集索引已经存在,但它不在rec_index列上?一个表只能有一个PK,只有一个聚集索引 - 它们不必是相同的约束/索引。我同意@Andriy--是PK没有聚集的问题,还是根本没有PK? –

回答

0

也许是这样的:

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

do <create index for rec_index> 
+0

thx。那就是诀窍。 – Dardar

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 

你当然可以进行检查每一个从系统元数据的这些方案,并做出相应的反应。但是你需要帮助我们缩小“没有指数”的含义。