1. ホーム
  2. sql-server

[解決済み] SQL Server の CREATE TABLE ステートメントで非クラスター型非ユニーク・インデックスを作成する。

2022-09-30 22:03:57

質問

SQL Server の CREATE TABLE ステートメント内で、プライマリ キーまたはユニーク インデックスを作成することができます。また 非ユニーク インデックスを作成することはできますか?

CREATE TABLE MyTable(
    a int NOT NULL
    ,b smallint NOT NULL
    ,c smallint NOT NULL
    ,d smallint NOT NULL
    ,e smallint NOT NULL

    -- This creates a primary key
    ,CONSTRAINT PK_MyTable PRIMARY KEY CLUSTERED (a)

    -- This creates a unique nonclustered index on columns b and c
    ,CONSTRAINT IX_MyTable1 UNIQUE (b, c)

    -- Is it possible to create a non-unique index on columns d and e here?
    -- Note: these variations would not work if attempted:
    -- ,CONSTRAINT IX_MyTable2 INDEX (d, e)
    -- ,CONSTRAINT IX_MyTable3 NONCLUSTERED INDEX (d, e)
);
GO

-- The proposed non-unique index should behave identically to
-- an index created after the CREATE TABLE statement. Example:
CREATE NONCLUSTERED INDEX IX_MyTable4 ON MY_TABLE (d, e);
GO

繰り返しますが、目標はCREATE TABLE文の後ではなく、その文の中で非一意なインデックスを作成することです。

価値あるものであるために、私は [SQL Server Books Online の CREATE TABLE に関するエントリ] を参照してください。 は役に立ちませんでした。

また [この質問】の] はほぼ同じですが、受理された回答は適用されません。

どのように解決するのですか?

SQL2014の時点では、以下の方法で実現できます。 インラインインデックス作成 :

CREATE TABLE MyTable(
    a int NOT NULL
    ,b smallint NOT NULL
    ,c smallint NOT NULL
    ,d smallint NOT NULL
    ,e smallint NOT NULL

    -- This creates a primary key
    ,CONSTRAINT PK_MyTable PRIMARY KEY CLUSTERED (a)

    -- This creates a unique nonclustered index on columns b and c
    ,CONSTRAINT IX_MyTable1 UNIQUE (b, c)

    -- This creates a standard non-clustered index on (d, e)
    ,INDEX IX_MyTable4 NONCLUSTERED (d, e)
);
GO


SQL2014以前のCREATE/ALTER TABLEでは、インデックスではなく、CONSTRAINTの追加のみを受け付けていました。主キー制約とユニーク制約がインデックスの観点から実装されているのは、副次的な効果です。