как удалить индексный ключ из таблицы - PullRequest
0 голосов
/ 18 августа 2011

Я использую 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>"

Ответы [ 2 ]

0 голосов
/ 18 августа 2011

Здесь так много возможностей, и я не уверен, в какую ситуацию вы попадаете, и что вы хотите сделать в каждом случае:

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

Вы, безусловно, можете выполнять проверки для каждого изэти сценарии из системных метаданных и реагируют соответственно.Но вы должны помочь нам сузить то, что вы подразумеваете под «без индекса».

0 голосов
/ 18 августа 2011

может быть что-то вроде:

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

do <create index for rec_index>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...