2011-08-18 117 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 

你當然可以進行檢查每一個從系統元數據的這些方案,並做出相應的反應。但是你需要幫助我們縮小「沒有指數」的含義。