web-dev-qa-db-ja.com

WITH使用時のエラー(DROP_EXISTING = ON)

さて、私はいくつかの小さなファイルからファイルを圧縮し、これらの雑多なテーブル用に作成したFGにそれらを移動しています。 WITH (DROP_EXISTING = ON)オプションを使用してインデックスを再作成することにより、これらのテーブルを移動してきましたが、うまく機能しています。しかし、今回はエラーが発生しました。これが私が実行しているスクリプトです

CREATE Unique CLUSTERED INDEX PK_MyTable 
    ON dbo.MyTable (MyTableID, RowStatus)  
    WITH (DROP_EXISTING = ON)  
    ON FG_Misc; 

これを実行すると、次のエラーメッセージが表示されます。

メッセージ1902、レベル16、状態3、行1

テーブル 'dbo.MyTable'に複数のクラスター化インデックスを作成することはできません。別のインデックスを作成する前に、既存のクラスター化インデックスPK_MyTableを削除してください。

これがこの特定のテーブルでこのエラーをスローする理由はわかりませんが、私が取り組んでいる他のエラーはスローされません。

2
Zane

これは、現在の主キーが非クラスター化であり、クラスター化インデックスも存在する場合に発生する可能性があります。

CREATE TABLE dbo.MyTable
(
    MyTableID integer NOT NULL,
    RowStatus tinyint NOT NULL,
    SomeOtherKey integer,

    CONSTRAINT [PK_MyTable]
        PRIMARY KEY NONCLUSTERED (MyTableID, RowStatus),

    CONSTRAINT [CUQ_MyTable]
        UNIQUE CLUSTERED (SomeOtherKey)
);
CREATE Unique CLUSTERED INDEX PK_MyTable 
    ON dbo.MyTable (MyTableID, RowStatus)  
    WITH (DROP_EXISTING = ON);

メッセージ1902、レベル16、状態3、行14
テーブル 'dbo.MyTable'に複数のクラスター化インデックスを作成できません。別のインデックスを作成する前に、既存のクラスター化インデックス 'CUQ_MyTable'を削除します。

DROP_EXISTING構文を使用して、主キーを非クラスター化からクラスター化に変更することは有効です。

CREATE TABLE dbo.MyTable
(
    MyTableID integer NOT NULL,
    RowStatus tinyint NOT NULL,
    SomeOtherKey integer,

    CONSTRAINT [PK_MyTable]
        PRIMARY KEY NONCLUSTERED (MyTableID, RowStatus),
);

CREATE Unique CLUSTERED INDEX PK_MyTable 
    ON dbo.MyTable (MyTableID, RowStatus)  
    WITH (DROP_EXISTING = ON); 
3
Paul White 9