ALTER TABLE (Transact-SQL)

列と制約の変更、追加、削除、パーティションの再割り当て、制約とトリガーの無効化や有効化などの方法で、テーブル定義を変更します。

トピック リンク アイコン Transact-SQL 構文表記規則

構文

ALTER TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name 
{ 
    ALTER COLUMN column_name 
    { 
        [ type_schema_name. ] type_name [ ( { precision [ , scale ] 
            | max | xml_schema_collection } ) ] 
        [ COLLATE collation_name ] 
        [ NULL | NOT NULL ] [ SPARSE ]

    | {ADD | DROP } 
        { ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION | SPARSE }
    } 
        | [ WITH { CHECK | NOCHECK } ]

    | ADD 
    { 
        <column_definition>
      | <computed_column_definition>
      | <table_constraint> 
      | <column_set_definition> 
    } [ ,...n ]

    | DROP 
     {
         [ CONSTRAINT ] 
         { 
              constraint_name 
              [ WITH 
               ( <drop_clustered_constraint_option> [ ,...n ] ) 
              ] 
          } [ ,...n ]
          | COLUMN 
          {
              column_name 
          } [ ,...n ]
     } [ ,...n ]
    | [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT 
        { ALL | constraint_name [ ,...n ] } 

    | { ENABLE | DISABLE } TRIGGER 
        { ALL | trigger_name [ ,...n ] }

    | { ENABLE | DISABLE } CHANGE_TRACKING 
        [ WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } ) ]

    | SWITCH [ PARTITION source_partition_number_expression ]
        TO target_table 
        [ PARTITION target_partition_number_expression ]

    | SET ( FILESTREAM_ON = { partition_scheme_name | filegroup | 
                "default" | "NULL" } )

    | REBUILD 
      [ [PARTITION = ALL]
        [ WITH ( <rebuild_option> [ ,...n ] ) ] 
      | [ PARTITION = partition_number 
           [ WITH ( <single_partition_rebuild_option> [ ,...n ] ) ]
        ]
      ]

    | <table_option>

    | <filetable_option>

}
[ ; ]

-- ALTER TABLE options


<column_set_definition> ::= 
    column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS

<drop_clustered_constraint_option> ::=  
    { 
        MAXDOP = max_degree_of_parallelism 
      | ONLINE = {ON | OFF }
      | MOVE TO { partition_scheme_name ( column_name ) | filegroup
          | "default" }
    }
<table_option> ::=
    {
        SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
    }

<filetable_option> ::=
    {
       [ { ENABLE | DISABLE } FILETABLE_NAMESPACE ]
       [ SET ( FILETABLE_DIRECTORY = directory_name ) ]
    }
<single_partition_rebuild__option> ::=
{
      SORT_IN_TEMPDB = { ON | OFF }
    | MAXDOP = max_degree_of_parallelism
    | DATA_COMPRESSION = { NONE | ROW | PAGE} }
}

引数

  • database_name
    テーブルが作成されたデータベースの名前を指定します。

  • schema_name
    テーブルが所属するスキーマの名前を指定します。

  • table_name
    変更するテーブルの名前を指定します。 テーブルが現在のデータベースにないか、現在のユーザーが所有するスキーマに含まれていない場合は、データベースとスキーマを明示的に指定する必要があります。

  • ALTER COLUMN
    指定した列に変更を加えます。

    変更する列に、次の列は指定できません。

    • timestamp 型の列。

    • テーブルの ROWGUIDCOL。

    • 計算列、または計算列の中で使用される列。

    • CREATE STATISTICS ステートメントによって生成された統計内の列。ただし、その列のデータ型が varchar 型、nvarchar 型、または varbinary 型であり、データ型の変更がなく、新しいサイズが前のサイズ以上になる場合と、列が NOT NULL から NULL に変更される場合は除きます。 最初に、DROP STATISTICS ステートメントで統計を削除します。 クエリ オプティマイザーによって自動的に生成された統計は、ALTER COLUMN によって自動的に削除されます。

    • PRIMARY KEY 制約、または [FOREIGN KEY] REFERENCES 制約で使用されている列。

    • CHECK 制約、または UNIQUE 制約で使用されている列。 ただし、CHECK 制約または UNIQUE 制約の中で使用されている可変長列の長さを変更することはできます。

    • 既定の定義に関連付けられている列。 ただし、データ型を変更しなければ、列の長さ、有効桁数、または小数点以下桁数は変更できます。

      text 型、ntext 型、および image 型の列は、次の場合にのみ変更できます。

      • text 型から varchar(max) 型、nvarchar(max) 型、または xml 型への変更

      • ntext 型から varchar(max) 型、nvarchar(max) 型、または xml 型への変更

      • image 型から varbinary(max)

      データ型を変更すると、データが変更される可能性があります。 たとえば、nchar 型または nvarchar 型の列を char 型または varchar 型に変更すると、拡張文字が変換される場合があります。 詳細については、「CAST および CONVERT (Transact-SQL)」を参照してください。 列の有効桁数または小数点以下桁数を減らすと、データが切り捨てられる可能性があります。

      パーティション テーブルの列のデータ型は変更できません。

    インデックスに含まれている列は、その列のデータ型が varchar、nvarchar、varbinary のいずれかであり、なおかつ変更後のサイズが変更前のサイズ以上という条件を満たさない限り、データ型を変更できません。

    主キー制約に含まれる列を NOT NULL から NULL に変更することはできません。

  • column_name
    変更、追加、または削除する列の名前を指定します。 column_name には、最大 128 文字まで指定できます。 timestamp データ型で作成される新しい列の場合は、column_name を省略できます。 timestamp 型の列に対して column_name を指定しない場合には、名前 timestamp が使用されます。

  • [ type_schema_name**.**] type_name
    更新する列の新しいデータ型、または追加する列のデータ型を指定します。 type_name は、パーティション テーブルの既存の列には指定できません。 type_name には次のいずれかを指定できます。

    • SQL Server システム データ型。

    • SQL Server システム データ型に基づく別名データ型。 別名データ型は、CREATE TYPE ステートメントで作成した後、テーブル定義で使用できます。

    • .NET Framework ユーザー定義型とそれが属するスキーマ。 .NET Framework ユーザー定義型は、CREATE TYPE ステートメントで作成した後、テーブル定義で使用できます。

    変更する列に対して type_name を指定する場合の条件を次に示します。

    • 以前のデータ型は、新しいデータ型に自動的に変換される必要があります。

    • type_name には timestamp を指定できません。

    • ANSI_NULL の既定値は ALTER COLUMN に対して常にオンです。指定しなかった場合、列では NULL 値が許容されます。

    • ANSI_PADDING の埋め込みは ALTER COLUMN に対して常にオンです。

    • 変更する列が ID 列の場合、new_data_type は、ID プロパティをサポートするデータ型であることが必要です。

    • SET ARITHABORT の現在の設定値は無視されます。 ALTER TABLE は、ARITHABORT がオンに設定されている場合と同様に動作します。

    注意

    COLLATE 句を指定しないで列のデータ型を変更すると、照合順序が、データベースの既定値とは異なってしまう場合があります。

  • precision
    指定されるデータ型の有効桁数です。 有効桁数値の詳細については、「有効桁数、小数点以下桁数、および長さ (Transact-SQL)」を参照してください。

  • scale
    指定するデータ型の小数点以下桁数を指定します。 小数点以下桁数値の詳細については、「有効桁数、小数点以下桁数、および長さ (Transact-SQL)」を参照してください。

  • max
    varchar 型、nvarchar 型、および varbinary 型にのみ適用されます。2^31-1 バイトの文字、バイナリ データ、Unicode データを格納する場合に使用します。

  • xml_schema_collection
    xml 型にのみ適用されます。XML スキーマを関連付ける場合に使用します。 xml 列をスキーマ コレクションに入力するには、先に CREATE XML SCHEMA COLLECTION を使ってスキーマ コレクションをデータベース内に作成する必要があります。

  • COLLATE < collation_name >
    変更する列の新しい照合順序を指定します。 照合順序を指定しない場合、データベースの既定の照合順序が列に割り当てられます。 照合順序名には、Windows 照合順序名または SQL 照合順序名を指定できます。 照合順序名の一覧と詳細については、「Windows 照合順序名 (Transact-SQL)」および「SQL Server 照合順序名 (Transact-SQL)」を参照してください。

    COLLATE 句を使用して照合順序を変更できるのは、char 型、varchar 型、nchar 型、および nvarchar 型の列だけです。 ユーザー定義の別名データ型列の照合順序を変更するには、別の ALTER TABLE ステートメントを実行して列を SQL Server システム データ型に変更し、その照合順序を変更した後、その列を別名データ型に戻します。

    次の条件の 1 つ以上に該当する場合、ALTER COLUMN で照合順序を変更することはできません。

    • CHECK 制約、FOREIGN KEY 制約、またはその列を参照する計算列が変更された場合。

    • 列にインデックス、統計、またはフルテキスト インデックスが作成された場合。 変更する列に対して自動的に作成された統計は、列の照合順序を変更すると削除されます。

    • スキーマ バインド ビューまたは関数で列が参照されている場合。

    詳細については、「COLLATE (Transact-SQL)」を参照してください。

  • NULL | NOT NULL
    列で NULL 値が許容されるかどうかを指定します。 NULL 値が許容されない列は、既定値が列に指定されているか、テーブルが空の場合にのみ、ALTER TABLE で追加できます。 計算列で NOT NULL を指定できるのは、同時に PERSISTED も指定した場合だけです。 新しい列で NULL 値が許容され、既定値を指定しない場合、テーブル内の各行の新しい列には NULL 値が格納されます。 新しい列で NULL 値が許容され、新しい列と共に既定の定義を追加した場合は、WITH VALUES を使用して、テーブル内にある各行の新しい列に既定値を格納できます。

    新しい列で NULL 値が許容されず、テーブルが空でない場合は、新しい列と共に DEFAULT 定義を追加する必要があります。これによって、既存の各行の新しい列には既定値が自動的に読み込まれます。

    ALTER COLUMN に NULL を指定することによって、NOT NULL 列で NULL 値が許容されるように設定できます。ただし、PRIMARY KEY 制約の列は除きます。 ALTER COLUMN に NOT NULL を指定できるのは、列に NULL 値が格納されていないときだけです。 ALTER COLUMN NOT NULL を指定する前に、NULL 値を別の値に更新しておく必要があります。たとえば次のように行います。

    UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL;
    ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR(20) NOT NULL;
    

    CREATE TABLE ステートメントまたは ALTER TABLE ステートメントでテーブルを作成または変更すると、データベースとセッションの設定によって、列定義で使われているデータ型の NULL 許容属性が影響を受けたり、場合によっては無効になることがあります。 計算列でない場合は、常に列を明示的に NULL または NOT NULL として定義することをお勧めします。

    ユーザー定義データ型の列を追加する場合は、NULL 値を許容するかどうかの設定がユーザー定義データ型と同じになるように列を定義し、列の既定値を指定することをお勧めします。 詳細については、「CREATE TABLE (Transact-SQL)」を参照してください。

    注意

    ALTER COLUMN に NULL または NOT NULL を指定した場合は、new_data_type [(precision [, scale ])] も指定する必要があります。 データ型、有効桁数、小数点以下桁数を変更しない場合は、その列の現在の値を指定します。

  • [ {ADD | DROP} ROWGUIDCOL ]
    指定した列に対して ROWGUIDCOL プロパティが追加または削除されます。 ROWGUIDCOL は、列が行の GUID 列であることを示します。 各テーブルでは 1 つの uniqueidentifier 列のみを ROWGUIDCOL 列として指定できます。ROWGUIDCOL プロパティは、uniqueidentifier 列にのみ割り当てることができます。 ROWGUIDCOL は、ユーザー定義データ型の列に割り当てることはできません。

    ROWGUIDCOL では列に一意な値が格納されるわけではなく、またテーブルに挿入される新しい行に対して値は自動的に生成されません。 各列に一意な値を生成するには、INSERT ステートメントで NEWID 関数を使用するか、列の既定値として NEWID 関数を指定します。

  • [ {ADD | DROP} PERSISTED ]
    指定した列に対して PERSISTED プロパティが追加または削除されます。 列は、決定的な式で定義される計算列であることが必要です。 PERSISTED として指定した列では、データベース エンジンによって物理的にテーブルに計算値が格納され、計算列が依存している他の列が更新されるとその計算値も更新されます。 計算列を PERSISTED とマークすることにより、決定的であるが不正確な式によって定義されている計算列にインデックスを作成できます。 詳細については、「計算列のインデックス」を参照してください。

    パーティション テーブルのパーティション分割列として使用する計算列には、明示的に PERSISTED とマークする必要があります。

  • DROP NOT FOR REPLICATION
    レプリケーション エージェントで挿入操作が実行されるときに、ID 列の値を増分することを指定します。 この句は column_name が ID 列の場合にのみ指定できます。

  • SPARSE
    列がスパース列であることを示します。 スパース列のストレージは NULL 値用に最適化されます。 スパース列を NOT NULL として指定することはできません。 スパース列を非スパース列に変換したり、非スパース列をスパース列に変換すると、コマンドの実行中にテーブルがロックされます。 REBUILD 句を使用して領域の節約を要求することが必要な場合があります。 スパース列のその他の制限事項と詳細については、「スパース列の使用」を参照してください。

  • WITH CHECK | WITH NOCHECK
    新しく追加または再有効化された FOREIGN KEY 制約や CHECK 制約に対して、テーブル内のデータを検証するかどうかを指定します。 指定しない場合、新しい制約には WITH CHECK が使用され、再有効化された制約には WITH NOCHECK が使用されます。

    既存のデータに対して新しい CHECK 制約または FOREIGN KEY 制約を検証しない場合は、WITH NOCHECK を使用します。 ごくわずかな例外を除き、このオプションは推奨されません。 新しい制約は、その後データが更新されるたびに評価されます。 制約の追加時、制約違反があっても WITH NOCHECK が指定されていたために検出されなかった場合、その後の更新で制約に従わないデータが使用されると行の更新が失敗する可能性があります。

    クエリ オプティマイザーでは、WITH NOCHECK が定義されている制約は考慮されません。 このような制約は、ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL を使用して再び有効にするまで無視されます。

  • ADD
    1 つ以上の列定義、計算列定義、またはテーブル制約を追加します。

  • DROP { [ CONSTRAINT ] constraint_name | COLUMN column_name }
    テーブルから constraint_name または column_name を削除します。 複数の列と制約を指定できます。

    ユーザー定義またはシステム提供の制約名は、sys.check_constraintsys.default_constraintssys.key_constraints、および sys.foreign_keys カタログ ビューに対してクエリを実行することにより確認できます。

    XML インデックスがテーブルに存在する場合、PRIMARY KEY 制約は削除できません。

    次の条件に該当する列は削除できません。

    • インデックスで使用されている列

    • CHECK、FOREIGN KEY、UNIQUE、または PRIMARY KEY 制約で使用されている列

    • DEFAULT キーワードで定義されたデフォルトに関連付けられている列、またはデフォルト オブジェクトにバインドしている列

    • ルールにバインドしている列

    注意

    列を削除しても、列のディスク領域は再確保されません。 テーブルの行サイズが制限に近いか制限を超えている場合は、必要に応じて、削除した列のディスク領域を再確保してください。 領域を再確保するには、テーブルにクラスター化インデックスを作成するか、ALTER INDEX を使用して既存のクラスター化インデックスを再構築します。 LOB データ型の削除による影響の詳細については、この CSS ブログ エントリを参照してください。

  • WITH <drop_clustered_constraint_option>
    1 つ以上の削除クラスター化制約オプションを設定します。

  • MAXDOP = max_degree_of_parallelism
    操作中は、max degree of parallelism 構成オプションを無効にします。 詳細については、「max degree of parallelism サーバー構成オプションの構成」を参照してください。

    並列プランの実行で使用されるプロセッサ数を制限するには、MAXDOP オプションを使用します。 最大数は 64 プロセッサです。

    max_degree_of_parallelism は次のいずれかの値をとります。

    • 1
      並列プラン生成を抑制します。

    • >1
      並列インデックス操作で使用される最大プロセッサ数を、指定数に制限します。

    • 0 (既定値)
      現在のシステム ワークロードに基づいて、実際の数以下のプロセッサを使用します。

    詳細については、「並列インデックス操作の構成」を参照してください。

    注意

    並列インデックス操作は、SQL Server のすべてのエディションで使用できるわけではありません。 詳細については、「SQL Server 2012 の各エディションがサポートする機能」を参照してください。

  • ONLINE = { ON | OFF }
    インデックス操作中に、基となるテーブルとそれに関連する各インデックスに対してクエリやデータ変更を行うことができるかどうかを指定します。 既定値は OFF です。 REBUILD は ONLINE 操作として実行できます。

    • ON
      長期のテーブル ロックは、インデックス操作の間は保持されません。 インデックス操作の主要フェーズの期間、ソース テーブルではインテント共有 (IS) ロックのみが保持されます。 このことにより、基になるテーブルとインデックスに対するクエリや更新は続行できます。 操作の開始時、非常に短い時間ですが、ソース オブジェクトでは共有 (S) ロックが保持されます。 また操作の終了時は、短い時間ですが、非クラクタ化インデックスが作成される場合は、ソース オブジェクト上で共有 (S) ロックの取得が行われます。また、クラスター化インデックスがオンラインで作成または削除され、クラスター化または非クラスター化インデックスが再構築される場合は、SCH-M (スキーマ修正) ロックが取得されます。 インデックスがローカル一時テーブルに作成される場合は、ONLINE を ON にできません。 シングル スレッドのヒープの再構築操作だけが許可されます。

    • OFF
      テーブル ロックは、インデックス操作の間適用されます。 クラスター化インデックスを作成、再構築、または削除するオフライン インデックス操作や、非クラスター化インデックスを再構築または削除するオフライン インデックス操作では、テーブルのスキーマ修正 (Sch-M) ロックが取得されます。 このため、操作中は、すべてのユーザーは基になるテーブルにアクセスできません。 非クラスター化インデックスを作成するオフライン インデックス操作では、テーブルの共有 (S) ロックが取得されます。 この場合は、基になるテーブルに対して更新は許可されませんが、SELECT ステートメントなどの読み取り操作は許可されます。 マルチスレッドのヒープの再構築操作が許可されます。

    詳細については、「オンライン インデックス操作の動作原理」を参照してください。

    注意

    オンラインでのインデックス操作は、SQL Server のすべてのエディションで使用できるわけではありません。 詳細については、「SQL Server 2012 の各エディションがサポートする機能」を参照してください。

  • MOVE TO { partition_scheme_name**(column_name [ 1,** ... n]) | filegroup | "default" }
    現在クラスター化インデックスのリーフ レベルに格納されているデータ行を移動する場所を指定します。 テーブルは新しい位置に移動します。 このオプションは、クラスター化インデックスを作成する制約にのみ適用されます。

    注意

    ここでは、default はキーワードではありません。 これは、既定のファイル グループの識別子で、MOVE TO "default" または MOVE TO [default] のように区切り記号で区切る必要があります。 "default" を指定する場合は、現在のセッションに対して QUOTED_IDENTIFIER オプションが ON になっている必要があります。 これは既定の設定です。 詳細については、「SET QUOTED_IDENTIFIER (Transact-SQL)」を参照してください。

  • { CHECK | NOCHECK } CONSTRAINT
    constraint_name を有効または無効にします。 このオプションは、FOREIGN KEY 制約と CHECK 制約でのみ使用できます。 NOCHECK を指定すると、制約は無効になり、今後列に行われる挿入または更新は、制約条件に対して検証されません。 DEFAULT、PRIMARY KEY、および UNIQUE 制約は無効にできません。

  • ALL
    すべての制約を、NOCHECK オプションで無効にするか CHECK オプションで有効にします。

  • { ENABLE | DISABLE } TRIGGER
    trigger_name を有効または無効にします。 トリガーを無効にしてもテーブルのトリガー定義は引き続き有効ですが、テーブルに対して INSERT、UPDATE、または DELETE ステートメントを実行しても、トリガーを再び有効にするまではトリガー内の動作が実行されることはありません。

  • ALL
    テーブル内のすべてのトリガーを有効または無効にします。

  • trigger_name
    無効または有効にするトリガーの名前を指定します。

  • { ENABLE | DISABLE } CHANGE_TRACKING
    テーブルに対して変更の追跡を有効にするかどうかを指定します。 既定では、変更の追跡が無効になっています。

    このオプションは、データベースに対して変更の追跡が有効になっている場合にのみ使用できます。 詳細については、「ALTER DATABASE の SET オプション (Transact-SQL)」を参照してください。

    変更の追跡を有効にするには、テーブルに主キーが必要です。

  • WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )
    更新された変更の追跡対象の列をデータベース エンジンが追跡するかどうかを指定します。 既定値は OFF です。

  • SWITCH [PARTITION source_partition_number_expression] TO [ schema_name**.**] target_table [ PARTITION target_ partition_number_expression ]
    次のいずれかの方法でデータのブロックを切り替えます。

    • テーブルのすべてのデータを、既に存在するパーティション テーブルにパーティションとして再度割り当てます。

    • 1 つのパーティション テーブルから別のパーティション テーブルに、パーティションを切り替えます。

    • パーティション テーブルの 1 つのパーティションにあるすべてのデータを、既存の非パーティション テーブルに再度割り当てます。

    table がパーティション テーブルの場合は、source_partition_number_expression を指定する必要があります。 target_table がパーティション分割されている場合は、target_partition_number_expression を指定する必要があります。 テーブルのデータを既に存在するパーティション テーブルにパーティションとして再度割り当てる場合、または 1 つのパーティション テーブルから別のパーティション テーブルにパーティションを切り替える場合は、対象のパーティションが存在し、空になっている必要があります。

    1 つのパーティションのデータを再度割り当てて単一のテーブルを作成する場合は、対象テーブルが既に作成されており、空になっている必要があります。 ソース テーブルまたはパーティションと、対象テーブルまたはパーティションは、両方とも同じファイル グループに存在する必要があります。 また、対応するインデックスまたはインデックス パーティションも、同じファイル グループに存在する必要があります。 切り替えるパーティションには、多くの追加の制限が適用されます。 table と target_table を同じにすることはできません。 target_table にはマルチパート識別子を指定できます。

    source_partition_number_expression および target_partition_number_expression は、変数や関数を参照できる定数式です。 これらの定数式には、ユーザー定義型変数とユーザー定義関数が含まれます。 これらの定数式で Transact-SQL 式を参照することはできません。

    レプリケーションを使用するときの SWITCH 制限については、「パーティション テーブルとパーティション インデックスのレプリケート」を参照してください。

  • SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | "default" | "NULL" })
    FILESTREAM データの格納場所を指定します。

    SET FILESTREAM_ON 句を指定した ALTER TABLE は、テーブルに FILESTREAM 列がない場合にのみ成功します。 FILESTREAM 列は、2 番目の ALTER TABLE ステートメントで追加できます。

    partition_scheme_name を指定した場合、CREATE TABLE のルールが適用されます。 テーブルは、行データ用にパーティション分割されている必要があります。また、テーブルのパーティション構成では、FILESTREAM パーティション構成と同じパーティション関数とパーティション列を使用する必要があります。

    filestream_filegroup_name には、FILESTREAM ファイル グループの名前を指定します。 ファイル グループには、CREATE DATABASE ステートメントまたは ALTER DATABASE ステートメントを使用してファイルが 1 つ定義されている必要があります。それ以外の場合は、エラーが発生します。

    "default" には、DEFAULT プロパティ セットを含む FILESTREAM ファイル グループを指定します。 FILESTREAM ファイル グループがない場合は、エラーが発生します。

    "NULL" を指定すると、テーブルの FILESTREAM ファイル グループへの参照がすべて削除されます。 最初にすべての FILESTREAM 列を削除する必要があります。 テーブルに関連付けられている FILESTREAM データをすべて削除するには、SET FILESTREAM_ON**="NULL"** を使用する必要があります。

  • SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
    許可されるテーブル ロックのエスカレーション方法を指定します。

    • AUTO
      このオプションを指定すると、SQL Server データベース エンジンで、テーブル スキーマに適したロック エスカレーションの粒度が選択されます。

      • テーブルがパーティション分割されている場合は、ロック エスカレーションをパーティション分割できます。 パーティション レベルにエスカレートされたロックが、後で TABLE 粒度にエスカレートされることはありません。

      • テーブルがパーティション分割されていない場合は、ロック エスカレーションは TABLE 粒度に設定されます。

    • TABLE
      テーブルがパーティション分割されているかどうかに関係なく、ロック エスカレーションはテーブルレベルの粒度で行われます。 この動作は SQL Server 2005 と同じです。 TABLE は既定値です。

    • DISABLE
      ほとんどの場合でロック エスカレーションを禁止します。 テーブルレベルのロックは完全には禁止されません。 たとえば、SERIALIZABLE 分離レベルでクラスター化インデックスがないテーブルをスキャンしている場合は、データベース エンジンでテーブル ロックを実行して、データの整合性を保護します。

  • REBUILD
    パーティション テーブル内のすべてのパーティションを含めたテーブル全体を再構築するには、REBUILD WITH 構文を使用します。 テーブルにクラスター化インデックスが含まれている場合、REBUILD オプションを指定すると、クラスター化インデックスが再構築されます。 REBUILD は ONLINE 操作として実行できます。

    パーティション テーブル内の 1 つのパーティションを再構築するには、REBUILD PARTITION 構文を使用します。

  • PARTITION = ALL
    パーティションの圧縮設定の変更時に、すべてのパーティションを再構築します。

  • REBUILD WITH ( <rebuild_option> )
    クラスター化インデックスを含むテーブルには、すべてのオプションが適用されます。 テーブルにクラスター化インデックスが含まれていない場合、ヒープ構造に影響を与えるのは一部のオプションだけです。

    REBUILD 操作で特定の圧縮設定を指定しないと、パーティションの現在の圧縮設定が使用されます。 現在の設定を取得するには、sys.partitions カタログ ビューで data_compression 列に対するクエリを実行します。

    再構築オプションの詳細については、「index_option (Transact-SQL)」を参照してください。

  • DATA_COMPRESSION
    指定したテーブル、パーティション番号、またはパーティション範囲に、データ圧縮オプションを指定します。 次のオプションがあります。

    • NONE
      テーブルまたは指定したパーティションが圧縮されません。

    • ROW
      行の圧縮を使用して、テーブルまたは指定したパーティションが圧縮されます。

    • PAGE
      ページの圧縮を使用して、テーブルまたは指定したパーティションが圧縮されます。

    複数のパーティションを同時に再構築するには、「index_option (Transact-SQL)」を参照してください。 テーブルにクラスター化インデックスが含まれていない場合、データ圧縮を変更するとヒープと非クラスター化インデックスが再構築されます。 圧縮の詳細については、「データの圧縮」を参照してください。

  • column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
    列セットの名前を指定します。 列セットは、型指定されていない XML 表記であり、テーブルのすべてのスパース列を 1 つにまとめて構造化した出力です。 スパース列を含むテーブルには列セットを追加できません。 列セットの詳細については、「列セットの使用」を参照してください。

  • { ENABLE | DISABLE } FILETABLE_NAMESPACE
    FileTable に対するシステム定義の制約を有効または無効にします。 FileTable でのみ使用できます。

  • SET ( FILETABLE_DIRECTORY = directory_name )
    Windows と互換性のある FileTable ディレクトリ名を指定します。 この名前は、データベース内のすべての FileTable ディレクトリ名の中で一意である必要があります。 一意性の比較では、SQL 照合順序の設定とは関係なく、大文字と小文字は区別されません。 FileTable でのみ使用できます。

説明

新しいデータ行を追加するには、INSERT を使用します。 データ行を削除するには、DELETE または TRUNCATE TABLE を使用します。 既存の行の値を変更するには、UPDATE を使用します。

プロシージャ キャッシュにテーブルを参照する実行プランがある場合、ALTER TABLE ではこれらの実行プランに対して、次の実行時に再コンパイルするというマークが付けられます。

列のサイズの変更

ALTER COLUMN 句で列のデータ型の新しいサイズを指定すると、列の長さ、有効桁数、または小数点以下桁数を変更できます。 列内にデータが存在する場合は、新しいサイズをデータの最大サイズより小さくすることはできません。 また、インデックス内で列を定義することはできません。ただし、その列のデータ型が varchar 型、nvarchar 型、または varbinary 型であり、インデックスが PRIMARY KEY 制約の結果として生じたものでない場合は除きます。 例 P を参照してください。

ロックと ALTER TABLE

ALTER TABLE で指定した変更は、直ちに実装されます。 変更でテーブル内の行の修正が必要になる場合、ALTER TABLE では行が更新されます。 ALTER TABLE では、変更中にテーブルのメタデータが他の接続で参照されないように、テーブルに対してスキーマ修正 (SCH-M) ロックが取得されます。ただし、オンライン インデックス操作の終了時に、非常に短い時間 SCH-M ロックを必要とする場合は、このロックの取得は行われません。 ALTER TABLE...SWITCH 操作では、ロックはソース テーブルと対象テーブルの両方に対して取得されます。 テーブルに加えられた変更はログに記録され、完全に復旧できます。 列の削除や、一部のエディションの SQL Server における既定値を伴う NOT NULL 列の追加など、きわめて大きなテーブル内のすべての行に影響する変更は、その実行終了までに長い時間がかかり、多くのログ レコードが生成されます。 このような ALTER TABLE ステートメントは、多くの行に影響する INSERT、UPDATE、DELETE の各ステートメントと同じように、十分な注意を払って実行する必要があります。

オンライン操作としての NOT NULL 列の追加

SQL Server 2012 Enterprise Edition では、既定値を持つ NOT NULL 列の追加は、既定値がランタイム定数である場合、オンライン操作です。 これは、テーブル内の行数に関係なく、操作がほぼ瞬時に完了することを意味します。 テーブル内の既存の行は、操作中に更新されないためです。その代わりに、既定値はテーブルのメタデータだけに格納され、これらの列にアクセスするクエリで必要になった場合に値が参照されます。 この動作は自動的に行われます。ADD COLUMN 構文以外に、オンライン操作を実装するための追加の構文は必要ありません。 ランタイム定数は、決定性に関係なく、テーブルの各行に対して実行時に同じ値を生成する式です。 たとえば、定数式 "My temporary data" やシステム関数 GETUTCDATETIME() は、ランタイム定数です。 一方、関数の NEWID() や NEWSEQUENTIALID() は、テーブルの各行で一意の値が生成されるので、ランタイム定数ではありません。 ランタイム定数ではない既定値を持つ NOT NULL 列の追加は、常にオフラインで実行され、操作中は排他 (SCH-M) ロックが取得されます。

既存の行はメタデータに格納された値を参照しますが、新しい行が挿入され、列に別の値が指定されない場合、既定値はその行に格納されます。 メタデータに格納された既定値は、行が更新されるか (UPDATE ステートメントで実際の列が指定されなくても)、テーブルまたはクラスター化インデックスが再構築された場合、既存の列に移動されます。

オンライン操作では、varchar(max)、nvarchar(max)、varbinary(max)、xml、text、ntext、image、hierarchyid、geometry、geography、または CLR UDTS 型の列は追加できません。 行の最大サイズが 8,060 バイトの制限を超える場合は、列をオンラインで追加することはできません。 その場合、列はオフライン操作として追加されます。

並列プランの実行

Microsoft SQL Server 2012 Enterprise では、単一の ALTER TABLE ADD (インデックス ベース) CONSTRAINT または DROP (クラスター化インデックス) CONSTRAINT ステートメントの実行に使用されるプロセッサ数は、max degree of parallelism 構成オプションと現在のワークロードによって決定されます。 データベース エンジンでシステムがビジー状態であることが検出されると、ステートメントの実行前に自動的に操作の並列処理の次数が減らされます。 MAXDOP オプションを指定すると、ステートメントの実行に使用されるプロセッサ数を手動で構成できます。 詳細については、「max degree of parallelism サーバー構成オプションの構成」を参照してください。

パーティション テーブル

ALTER TABLE は、パーティション テーブルを対象にした SWITCH 操作の実行に使用できるほか、非パーティション テーブルと同様に、パーティション テーブルの列、制約、トリガーの状態を変更する場合にも使用できます。 ただし、このステートメントを使用して、テーブル自体のパーティション分割方法を変更することはできません。 パーティション テーブルを再びパーティション分割するには、ALTER PARTITION SCHEME および ALTER PARTITION FUNCTION を使用します。 また、パーティション テーブルの列のデータ型を変更することもできません。

スキーマ バインド ビューによるテーブルへの制限

スキーマ バインド ビューのあるテーブルに ALTER TABLE ステートメントを実行するときに適用される制約は、単純なインデックスのあるテーブルを変更する場合に現在適用されている制約と同じです。 列の追加は許可されますが、 任意のスキーマ バインド ビューに含まれる列を削除または変更することはできません。 ALTER TABLE ステートメントによって、スキーマ バインド ビューで使用されている列の変更が要求された場合、ALTER TABLE は失敗し、データベース エンジンではエラー メッセージが表示されます。 スキーマ バインド ビューとインデックス付きビューの詳細については、「CREATE VIEW (Transact-SQL)」を参照してください。

ベース テーブルを参照するスキーマ バインド ビューを作成しても、そのテーブルに対するトリガーの追加や削除には影響はありません。

インデックスと ALTER TABLE

制約が削除されると、制約の要素として作成されたインデックスも削除されます。 CREATE INDEX で作成されたインデックスは、DROP INDEX で削除する必要があります。 ALTER INDEX ステートメントを使用すると、制約定義の要素であるインデックスを再構築できます。ALTER TABLE で制約を削除して再び追加する必要はありません。

列に基づくすべてのインデックスと制約を削除してからでないと、列は削除できません。

クラスター化インデックスを作成した制約が削除されると、クラスター化インデックスのリーフ レベルに格納されていたデータ行は、非クラスター化テーブルに格納されるようになります。 MOVE TO オプションを指定すると、1 つのトランザクションで、クラスター化インデックスを削除し、その結果生成されたテーブルを別のファイル グループまたはパーティション構成に移動できます。 MOVE TO オプションには次の制限があります。

  • MOVE TO は、インデックス付きビューまたは非クラスター化インデックスに対しては有効ではありません。

  • パーティション構成またはファイル グループは、既に存在している必要があります。

  • MOVE TO を指定しない場合、テーブルは、クラスター インデックスに定義されたものと同じパーティション構成またはファイル グループに配置されます。

クラスター化インデックスを削除すると、ONLINE = ON オプションを指定できます。このため、DROP INDEX トランザクションによって、基になるデータや関連する非クラスター化インデックスに対するクエリおよび変更がブロックされることはありません。

ONLINE = ON には次の制限があります。

  • ONLINE = ON は、無効化されたクラスター化インデックスに対しては有効ではありません。 無効化されたインデックスは、ONLINE = OFF を使って削除する必要があります。

  • 一度に 1 つのインデックスのみを削除できます。

  • ONLINE = ON は、インデックス付きビュー、非クラスター化インデックス、またはローカル一時テーブル上のインデックスに対しては有効ではありません。

既存のクラスター化インデックスを削除するには、クラスター化インデックスの大きさと同じ一時ディスク領域が必要です。 この追加領域は、操作が完了するとすぐに解放されます。

注意

<drop_clustered_constraint_option> に示されているオプションは、テーブル上のクラスター化インデックスに適用され、ビュー上のクラスター化インデックスまたは非クラスター化インデックスには適用できません。

スキーマ変更のレプリケート

既定では、SQL Server パブリッシャーでパブリッシュされたテーブルに ALTER TABLE を実行すると、すべての SQL Server サブスクライバーに変更が反映されます。 この機能にはいくつか制限事項があります。また、この機能は無効にできます。 詳細については、「パブリケーション データベースでのスキーマの変更」を参照してください。

データの圧縮

システム テーブルで圧縮を有効にすることはできません。 . テーブルがヒープの場合、ONLINE モードでは、再構築操作がシングル スレッドになります。 マルチスレッドのヒープの再構築操作では、OFFLINE モードを使用してください。 データ圧縮の詳細については、「データの圧縮」を参照してください。

圧縮状態の変更による、テーブル、インデックス、またはパーティションへの影響を評価するには、sp_estimate_data_compression_savings ストアド プロシージャを使用します。

パーティション テーブルには次の制限が適用されます。

  • 固定されていないインデックスがテーブルにある場合、そのパーティションの圧縮設定を変更できません。

  • ALTER TABLE <table> REBUILD PARTITION ... 構文は、指定されたパーティションを再構築します。

  • ALTER TABLE <table> REBUILD WITH ... 構文は、すべてのパーティションを再構築します。

NTEXT 列の削除

NTEXT 列を削除すると、すべての行に対する連続操作として、削除されたデータのクリーンアップが実行されます。 この操作には、かなりの時間がかかる場合があります。 削除しようとする NTEXT 列に大量の行が存在するときは、まず NTEXT 列を NULL 値に更新してから、列を削除するようにしてください。 この処理は並列操作で実行できるため、所要時間を大幅に短縮できます。

互換性サポート

ALTER TABLE ステートメントでは、2 部構成 (schema.object) のテーブル名だけを使用できます。 SQL Server 2012 では、次の形式を使用してテーブル名を指定すると、コンパイル時にエラー 117 で失敗します。

  • server.database.schema.table

  • .database.schema.table

  • ..schema.table

以前のバージョンでは、server.database.schema.table という形式を指定すると、エラー 4902 が返されました。 .database.schema.table または ..schema.table という形式を指定すると、成功しました。

問題を解決するには、4 部構成のプレフィックスの使用を削除してください。

権限

テーブルに対する ALTER 権限が必要です。

ALTER TABLE 権限は、ALTER TABLE SWITCH ステートメントに含まれる両方のテーブルに適用されます。 切り替えられるデータには、対象テーブルのセキュリティが継承されます。

ALTER TABLE ステートメント内の列が、共通言語ランタイム (CLR) ユーザー定義型または別名データ型として定義されている場合は、そのデータ型に対する REFERENCES 権限が必要です。

テーブルの行を更新する列を追加するには、テーブルの UPDATE 権限が必要です。 たとえば、既定値の NOT NULL 列を追加する場合や、テーブルが空でないときに ID 列を追加する場合です。

使用例

カテゴリ

主な構文要素

列と制約を追加する

ADD • PRIMARY KEY とインデックス オプション • スパース列と列セット •

列と制約を削除する

DROP

列定義を変更する

データ型の変更 • 列のサイズの変更 • 照合順序

テーブル定義を変更する

DATA_COMPRESSION • SWITCH PARTITION • LOCK ESCALATION • 変更の追跡

制約およびトリガーを無効および有効にする

CHECK • NO CHECK • ENABLE TRIGGER • DISABLE TRIGGER

列と制約を追加する

このセクションの例では、テーブルに列と制約を追加する方法を示します。

A. 新しい列を追加する

次の例では、NULL 値を許容し、DEFAULT 定義で値が提供されない列を追加します。 新しい列では、各行に NULL が設定されます。

CREATE TABLE dbo.doc_exa (column_a INT) ;
GO
ALTER TABLE dbo.doc_exa ADD column_b VARCHAR(20) NULL ;
GO

B. 制約を含む列を追加する

次の例では、UNIQUE 制約を含む新しい列を追加します。

CREATE TABLE dbo.doc_exc (column_a INT) ;
GO
ALTER TABLE dbo.doc_exc ADD column_b VARCHAR(20) NULL 
    CONSTRAINT exb_unique UNIQUE ;
GO
EXEC sp_help doc_exc ;
GO
DROP TABLE dbo.doc_exc ;
GO

C. 既存の列に検証なしの CHECK 制約を追加する

次の例では、テーブル内の既存の列に制約を追加します。 列には制約に違反する値があります。 このため、制約が既存の行に対して検証されないよう、また制約を追加できるよう、WITH NOCHECK を使用します。

CREATE TABLE dbo.doc_exd ( column_a INT) ;
GO
INSERT INTO dbo.doc_exd VALUES (-1) ;
GO
ALTER TABLE dbo.doc_exd WITH NOCHECK 
ADD CONSTRAINT exd_check CHECK (column_a > 1) ;
GO
EXEC sp_help doc_exd ;
GO
DROP TABLE dbo.doc_exd ;
GO

D. 既存の行に DEFAULT 制約を追加する

次の例では、2 つの列を含んだテーブルを作成し、最初の列には値を挿入し、もう 1 つの列は NULL のままにします。 2 番目の列には DEFAULT 制約を追加します。 既定値が適用されていることを確認するには、最初の列にさらに値を挿入し、テーブルに対してクエリを実行します。

CREATE TABLE dbo.doc_exz ( column_a INT, column_b INT) ;
GO
INSERT INTO dbo.doc_exz (column_a)VALUES ( 7 ) ;
GO
ALTER TABLE dbo.doc_exz
ADD CONSTRAINT col_b_def
DEFAULT 50 FOR column_b ;
GO
INSERT INTO dbo.doc_exz (column_a) VALUES ( 10 ) ;
GO
SELECT * FROM dbo.doc_exz ;
GO
DROP TABLE dbo.doc_exz ;
GO

E. 制約を含む列を複数追加する

次の例では、制約を含む列を複数追加します。制約は新しい列ごとに定義されます。 先頭の新しい列には IDENTITY プロパティが設定され、 テーブル内の各行では、ID 列に新しい増分値が挿入されます。

CREATE TABLE dbo.doc_exe ( column_a INT CONSTRAINT column_a_un UNIQUE) ;
GO
ALTER TABLE dbo.doc_exe ADD 

-- Add a PRIMARY KEY identity column.
column_b INT IDENTITY
CONSTRAINT column_b_pk PRIMARY KEY, 

-- Add a column that references another column in the same table.
column_c INT NULL  
CONSTRAINT column_c_fk 
REFERENCES doc_exe(column_a),

-- Add a column with a constraint to enforce that 
-- nonnull data is in a valid telephone number format.
column_d VARCHAR(16) NULL 
CONSTRAINT column_d_chk
CHECK 
(column_d LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]' OR
column_d LIKE
'([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'),

-- Add a nonnull column with a default.
column_e DECIMAL(3,3)
CONSTRAINT column_e_default
DEFAULT .081 ;
GO
EXEC sp_help doc_exe ;
GO
DROP TABLE dbo.doc_exe ;
GO

F. NULL 値を許容する列を既定値と共に追加する

次の例では、NULL 値を許容する列を DEFAULT 定義と共に追加し、WITH VALUES を使用して、テーブル内の既存の各行に値を格納します。 WITH VALUES を使用しない場合、新しい列には NULL 値が格納されます。

USE AdventureWorks2012 ; 
GO
CREATE TABLE dbo.doc_exf ( column_a INT) ;
GO
INSERT INTO dbo.doc_exf VALUES (1) ;
GO
ALTER TABLE dbo.doc_exf 
ADD AddDate smalldatetime NULL
CONSTRAINT AddDateDflt
DEFAULT GETDATE() WITH VALUES ;
GO
DROP TABLE dbo.doc_exf ;
GO

G. PRIMARY KEY 制約をインデックス オプションと共に作成する

次の例では、PRIMARY KEY 制約 PK_TransactionHistoryArchive_TransactionID を作成し、オプション FILLFACTOR、ONLINE、および PAD_INDEX を設定します。 結果のクラスター化インデックスは制約と同じ名前になります。

USE AdventureWorks2012;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK 
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID)
WITH (FILLFACTOR = 75, ONLINE = ON, PAD_INDEX = ON);
GO

H. スパース列を追加する

次の例では、テーブル T1 にスパース列を追加する方法と、T1 のスパース列を変更する方法を示します。 テーブル T1 を作成するコードは次のとおりです。

CREATE TABLE T1
(C1 int PRIMARY KEY,
C2 varchar(50) SPARSE NULL,
C3 int SPARSE NULL,
C4 int ) ;
GO

スパース列 C5 を追加するには、次のステートメントを実行します。

ALTER TABLE T1
ADD C5 char(100) SPARSE NULL ;
GO

非スパース列 C4 をスパース列に変換するには、次のステートメントを実行します。

ALTER TABLE T1
ALTER COLUMN C4 ADD SPARSE ;
GO

スパース列 C4 を非スパース列に変換するには、次のステートメントを実行します。

ALTER TABLE T1
ALTER COLUMN C4 DROP SPARSE;
GO

I. 列セットを追加する

次の例では、テーブル T2 に列を追加する方法を示します。 既にスパース列が含まれているテーブルには列セットを追加できません。 テーブル T2 を作成するコードは次のとおりです。

CREATE TABLE T2
(C1 int PRIMARY KEY,
C2 varchar(50) NULL,
C3 int NULL,
C4 int ) ;
GO

次の 3 つのステートメントでは、CS という列セットが追加され、列 C2 および C3 が SPARSE に変更されます。

ALTER TABLE T2
ADD CS XML COLUMN_SET FOR ALL_SPARSE_COLUMNS ;
GO

ALTER TABLE T2
ALTER COLUMN C2 ADD SPARSE ; 
GO

ALTER TABLE T2
ALTER COLUMN C3 ADD SPARSE ;
GO

[トップに戻る] リンクで使用される矢印アイコン[先頭に戻る]

列と制約を削除する

このセクションの例では、列と制約を削除する方法を示します。

A. 1 つまたは複数の列を削除する

最初の例では、テーブルを変更して列を削除します。 2 番目の例では、複数の列を削除します。

CREATE TABLE dbo.doc_exb 
    (column_a INT
     ,column_b VARCHAR(20) NULL
     ,column_c datetime
     ,column_d int) ;
GO
-- Remove a single column.
ALTER TABLE dbo.doc_exb DROP COLUMN column_b ;
GO
-- Remove multiple columns.
ALTER TABLE dbo.doc_exb DROP COLUMN column_c, column_d;

B. 制約と列を削除する

最初の例では、テーブルから UNIQUE 制約を削除します。 2 番目の例では、2 つの制約と 1 つの列を削除します。

CREATE TABLE dbo.doc_exc ( column_a int NOT NULL CONSTRAINT my_constraint UNIQUE) ;
GO

-- Example 1. Remove a single constraint.
ALTER TABLE dbo.doc_exc DROP my_constraint ;
GO

DROP TABLE dbo.doc_exc;
GO

CREATE TABLE dbo.doc_exc ( column_a int  
                          NOT NULL CONSTRAINT my_constraint UNIQUE
                          ,column_b int 
                          NOT NULL CONSTRAINT my_pk_constraint PRIMARY KEY) ;
GO

-- Example 2. Remove two constraints and one column
-- The keyword CONSTRAINT is optional. The keyword COLUMN is required.
ALTER TABLE dbo.doc_exc 

    DROP CONSTRAINT CONSTRAINT my_constraint, my_pk_constraint, COLUMN column_b ;
GO

C. ONLINE モードで PRIMARY KEY 制約を削除する

次の例では、ONLINE オプションを ON に設定して PRIMARY KEY 制約を削除します。

USE AdventureWorks2012;
GO
ALTER TABLE Production.TransactionHistoryArchive
DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID
WITH (ONLINE = ON);
GO

D. FOREIGN KEY 制約を追加および削除する

次の例では、ContactBackup テーブルを作成し、Person.Person テーブルを参照する FOREIGN KEY 制約を追加した後、FOREIGN KEY 制約を削除して、テーブルを変更します。

USE AdventureWorks2012 ;
GO
CREATE TABLE Person.ContactBackup
    (ContactID int) ;
GO

ALTER TABLE Person.ContactBackup
ADD CONSTRAINT FK_ContactBacup_Contact FOREIGN KEY (ContactID)
    REFERENCES Person.Person (BusinessEntityID) ;
GO

ALTER TABLE Person.ContactBackup
DROP CONSTRAINT FK_ContactBacup_Contact ;
GO

DROP TABLE Person.ContactBackup ;

[トップに戻る] リンクで使用される矢印アイコン[先頭に戻る]

列定義を変更する

A. 列のデータ型を変更する

次の例では、テーブルの列を INT 型から DECIMAL 型に変更します。

CREATE TABLE dbo.doc_exy (column_a INT ) ;
GO
INSERT INTO dbo.doc_exy (column_a) VALUES (10) ;
GO
ALTER TABLE dbo.doc_exy ALTER COLUMN column_a DECIMAL (5, 2) ;
GO
DROP TABLE dbo.doc_exy ;
GO

B. 列のサイズを変更する

次の例では、varchar 列のサイズと、decimal 列の有効桁数および小数点以下桁数を拡張します。 列にデータが含まれているため、列のサイズは拡張することしかできません。 また、col_a が一意インデックスで定義されていることにも注意してください。 この場合でも、col_a のサイズは拡張できます。データ型が varchar 型であり、インデックスが PRIMARY KEY 制約の結果として生じたものでないためです。

IF OBJECT_ID ( 'dbo.doc_exy', 'U' ) IS NOT NULL 
    DROP TABLE dbo.doc_exy;
GO
-- Create a two-column table with a unique index on the varchar column.
CREATE TABLE dbo.doc_exy ( col_a varchar(5) UNIQUE NOT NULL, col_b decimal (4,2));
GO
INSERT INTO dbo.doc_exy VALUES ('Test', 99.99);
GO
-- Verify the current column size.
SELECT name, TYPE_NAME(system_type_id), max_length, precision, scale
FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.doc_exy');
GO
-- Increase the size of the varchar column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_a varchar(25);
GO
-- Increase the scale and precision of the decimal column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_b decimal (10,4);
GO
-- Insert a new row.
INSERT INTO dbo.doc_exy VALUES ('MyNewColumnSize', 99999.9999) ;
GO
-- Verify the current column size.
SELECT name, TYPE_NAME(system_type_id), max_length, precision, scale
FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.doc_exy');

C. 列の照合順序を変更する

次の例では、列の照合順序を変更する方法を示します。 まず、既定のユーザー照合順序でテーブルを作成します。

CREATE TABLE T3
(C1 int PRIMARY KEY,
C2 varchar(50) NULL,
C3 int NULL,
C4 int ) ;
GO

次に、列 C2 の照合順序を Latin1_General_BIN に変更します。 データ型は変更しませんが、必須であることに注意してください。

ALTER TABLE T3
ALTER COLUMN C2 varchar(50) COLLATE Latin1_General_BIN;
GO

[トップに戻る] リンクで使用される矢印アイコン[先頭に戻る]

テーブル定義を変更する

このセクションの例では、テーブルの定義を変更する方法を示します。

A. テーブルを修正して圧縮を変更する

次の例では、非パーティション テーブルの圧縮を変更します。 ヒープまたはクラスター化インデックスが再構築されます。 テーブルがヒープの場合、すべての非クラスター化インデックスが再構築されます。

ALTER TABLE T1 
REBUILD WITH (DATA_COMPRESSION = PAGE);

次の例では、パーティション テーブルの圧縮を変更します。 REBUILD PARTITION = 1 構文を使用すると、パーティション番号 1 のみが再構築されます。

ALTER TABLE PartitionTable1 
REBUILD PARTITION = 1 WITH (DATA_COMPRESSION =  NONE) ;
GO

次の代替構文を使用して同じ操作を行うと、テーブル内のすべてのパーティションが再構築されます。

ALTER TABLE PartitionTable1 
REBUILD PARTITION = ALL 
WITH (DATA_COMPRESSION = PAGE ON PARTITIONS(1) ) ;

その他のデータの圧縮の例については、「データの圧縮」を参照してください。

B. テーブル間でパーティションを切り替える

次の例では、パーティション テーブルを作成します。ここでは、データベースにパーティション構成 myRangePS1 が既に作成されていることが前提となります。 次に、パーティション テーブルと同じ構造で、PartitionTable テーブルの PARTITION 2 と同じファイル グループに、非パーティション テーブルを作成し、 PartitionTable テーブルの PARTITION 2 のデータを、NonPartitionTable テーブルに切り替えます。

CREATE TABLE PartitionTable (col1 int, col2 char(10))
ON myRangePS1 (col1) ;
GO
CREATE TABLE NonPartitionTable (col1 int, col2 char(10))
ON test2fg ;
GO
ALTER TABLE PartitionTable SWITCH PARTITION 2 TO NonPartitionTable ;
GO

C. パーティション テーブルでのロック エスカレーションを許可する

次の例では、パーティション テーブルで、パーティション レベルへのロック エスカレーションを有効にします。 テーブルがパーティション分割されていない場合は、ロック エスカレーションは TABLE レベルに設定されます。

ALTER TABLE dbo.T1 SET (LOCK_ESCALATION = AUTO);
GO

D. テーブルに変更の追跡を構成する

次の例では、Person.Person テーブルの変更の追跡を有効にします。

USE AdventureWorks2012;
ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING;

次の例では、変更の追跡を有効にし、変更時に更新される列の追跡を有効にします。

USE AdventureWorks2012;
GO
ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON)

次の例では、Person.Person テーブルの変更の追跡を無効にします。

USE AdventureWorks2012;
Go
ALTER TABLE Person.Person
DISABLE CHANGE_TRACKING;

[トップに戻る] リンクで使用される矢印アイコン[先頭に戻る]

制約およびトリガーを無効および有効にする

A. 制約を無効化および再有効化する

次の例では、データとして許容される給与を制限する制約を無効にします。 ここでは、ALTER TABLE と共に NOCHECK CONSTRAINT を使用して制約を無効にし、通常は制約違反となるような挿入を許可します。 次に、CHECK CONSTRAINT を使用して制約を再び有効にします。

CREATE TABLE dbo.cnst_example 
(id INT NOT NULL,
 name VARCHAR(10) NOT NULL,
 salary MONEY NOT NULL
    CONSTRAINT salary_cap CHECK (salary < 100000)
);

-- Valid inserts
INSERT INTO dbo.cnst_example VALUES (1,'Joe Brown',65000);
INSERT INTO dbo.cnst_example VALUES (2,'Mary Smith',75000);

-- This insert violates the constraint.
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000);

-- Disable the constraint and try again.
ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000);

-- Re-enable the constraint and try another insert; this will fail.
ALTER TABLE dbo.cnst_example CHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (4,'Eric James',110000) ;

B. トリガーを無効化および再有効化する

次の例では、ALTER TABLE の DISABLE TRIGGER オプションを使用してトリガーを無効にし、通常はトリガー違反となるような挿入を許可します。 次に、ENABLE TRIGGER を使用してトリガーを再び有効にします。

CREATE TABLE dbo.trig_example 
(id INT, 
name VARCHAR(12),
salary MONEY) ;
GO
-- Create the trigger.
CREATE TRIGGER dbo.trig1 ON dbo.trig_example FOR INSERT
AS
IF (SELECT COUNT(*) FROM INSERTED
WHERE salary > 100000) > 0
BEGIN
    print 'TRIG1 Error: you attempted to insert a salary > $100,000'
    ROLLBACK TRANSACTION
END ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (1,'Pat Smith',100001) ;
GO
-- Disable the trigger.
ALTER TABLE dbo.trig_example DISABLE TRIGGER trig1 ;
GO
-- Try an insert that would typically violate the trigger.
INSERT INTO dbo.trig_example VALUES (2,'Chuck Jones',100001) ;
GO
-- Re-enable the trigger.
ALTER TABLE dbo.trig_example ENABLE TRIGGER trig1 ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (3,'Mary Booth',100001) ;
GO

[トップに戻る] リンクで使用される矢印アイコン[先頭に戻る]

関連項目

参照

sys.tables (Transact-SQL)

sp_rename (Transact-SQL)

CREATE TABLE (Transact-SQL)

DROP TABLE (Transact-SQL)

sp_help (Transact-SQL)

ALTER PARTITION SCHEME (Transact-SQL)

ALTER PARTITION FUNCTION (Transact-SQL)

EVENTDATA (Transact-SQL)