主キーではないSQL Server 2008のテーブル作成ステートメントからクラスター化インデックスを作成することはできますか?
これはSQL Azureのテーブルを対象としているため、最初にテーブルを作成してから、そのテーブルにクラスター化インデックスを作成するという選択肢はありません。
編集:どうやら問題の原因はFluentMigratorでした。バージョンテーブルにはクラスター化インデックスがないため、テーブルではなくバージョン管理テーブルを作成しようとしてエラーが発生していました。
はい、主キーではないクラスター化インデックスを作成することは可能です。 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にアップグレードするための手順 があります。
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]
以下のコードは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では、テーブル作成ステートメント以外の場所でクラスター化インデックスを指定することはできません。