web-dev-qa-db-ja.com

SQL Serverがプライマリキーなしでクラスター化インデックスを使用してテーブルを作成しています

主キーではないSQL Server 2008のテーブル作成ステートメントからクラスター化インデックスを作成することはできますか?

これはSQL Azureのテーブルを対象としているため、最初にテーブルを作成してから、そのテーブルにクラスター化インデックスを作成するという選択肢はありません。

編集:どうやら問題の原因はFluentMigratorでした。バージョンテーブルにはクラスター化インデックスがないため、テーブルではなくバージョン管理テーブルを作成しようとしてエラーが発生していました。

19
Chris Marisic

はい、主キーではないクラスター化インデックスを作成することは可能です。 CREATE CLUSTERED INDEX ステートメント。

CREATE TABLE dbo.myTable (
    myTableId int PRIMARY KEY NONCLUSTERED
    myColumn int NOT NULL
)

CREATE CLUSTERED INDEX myIndex ON dbo.myTable(myColumn)

Azure SQL Database v12より前のバージョンでは、テーブルにデータを挿入する前にクラスター化インデックスが必要でした。 Azure SQL Database v12 の時点で、ヒープ(クラスター化インデックスのないテーブル)がサポートされるようになりました。

データベースが2016年6月より前に作成された場合、 バージョン12にアップグレードするための手順 があります。

42
Rob Boek
CREATE TABLE dbo.Table_1
    (
    Id int NOT NULL IDENTITY (1, 1) PRIMARY KEY NONCLUSTERED,
    SomeOtherUniqueColumn int NOT NULL CONSTRAINT Item4 UNIQUE CLUSTERED
)  ON [PRIMARY]

主キーでの非クラスター化の仕様に注意してください

これでも機能します。

CREATE TABLE dbo.Table_1
    (
    SomeOtherUniqueColumn int NOT NULL CONSTRAINT Item4 UNIQUE CLUSTERED
)  ON [PRIMARY]
8
Buildstarted

以下のコードはAzureと互換性があります。 1つのcreate tableステートメントで、非クラスター化プライマリキーとクラスター化インデックスを作成します。この構文では、キーに複数の列を指定することもできます。

CREATE TABLE MyTable (
    ID uniqueidentifier  NOT NULL,
    UserID uniqueidentifier  NOT NULL,
    EntryDate DATETIME NOT NULL,
    CONSTRAINT PK_MyPrimaryKey_Name PRIMARY KEY NONCLUSTERED (ID),
    CONSTRAINT UCI_MyClusteredIndexName UNIQUE CLUSTERED (UserID ASC,EntryDate ASC,ID ASC)
);

テーブルのクラスター化インデックスを変更するには、クラスター化インデックスを削除する必要があります。これにより、テーブルがヒープに変換され、新しいクラスター化インデックスが適用されます。 Azureはヒープ(クラスター化インデックスのないテーブル)をサポートしていないため、テーブルを削除して再作成せずにクラスター化インデックスを変更することはできません。 Azureでは、テーブル作成ステートメント以外の場所でクラスター化インデックスを指定することはできません。

0
David Sopko