次の方法で共有


ALTER TABLE table_constraint (Transact-SQL)

applies to:SQL ServerAzure SQL DatabaseAzure SQL Managed Instancewarehouse in Microsoft FabricMicrosoft FabricSQL データベース>

ALTER TABLE を使用して、PRIMARY KEY のプロパティを指定します。 UNIQUEFOREIGN KEYCHECK 制約、または ALTER TABLE (Transact-SQL) を使用してテーブルに追加するDEFAULT定義。

Transact-SQL 構文規則

Syntax

[ CONSTRAINT constraint_name ]   
{   
    { PRIMARY KEY | UNIQUE }   
        [ CLUSTERED | NONCLUSTERED ]   
        (column [ ASC | DESC ] [ ,...n ] )  
        [ WITH FILLFACTOR = fillfactor   
        [ WITH ( <index_option>[ , ...n ] ) ]  
        [ ON { partition_scheme_name ( partition_column_name ... )  
          | filegroup | "default" } ]   
    | FOREIGN KEY   
        ( column [ ,...n ] )  
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]   
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]   
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]   
        [ NOT FOR REPLICATION ]   
    | CONNECTION
        ( { node_table TO node_table } 
          [ , {node_table TO node_table }]
          [ , ...n ]
        )
        [ ON DELETE { NO ACTION | CASCADE } ]
    | DEFAULT constant_expression FOR column [ WITH VALUES ]   
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression )  
}  

Arguments

CONSTRAINT

PRIMARY KEYUNIQUEFOREIGN KEY、またはCHECK制約、またはDEFAULTの定義の開始を指定します。

constraint_name

制約の名前。 制約名は 識別子の規則に従う必要があります。ただし、名前を番号記号 (#) で始めることはできません。 constraint_nameを指定しない場合、生成された名前が制約に割り当てられます。

主キー

一意のインデックスを使用して、指定した列にエンティティの整合性を適用する制約。 テーブルごとに作成できる PRIMARY KEY 制約は 1 つだけです。

UNIQUE

一意のインデックスを使用して、指定した列にエンティティの整合性を提供する制約。

クラスタ化 |非クラスタ化

PRIMARY KEY制約またはUNIQUE制約に対してクラスター化インデックスまたは非クラスター化インデックスを作成することを指定します。 PRIMARY KEY 制約は既定で CLUSTEREDされます。 UNIQUE 制約は既定で NONCLUSTEREDされます。

クラスター化制約またはインデックスがテーブルに既に存在する場合、 CLUSTEREDを指定することはできません。 クラスター化制約またはインデックスがテーブルに既に存在する場合、 PRIMARY KEY 制約は既定で NONCLUSTEREDされます。

インデックスの列として 、ntexttextvarchar(max)nvarchar(max)varbinary(max)xml、または image データ型の列を指定することはできません。

column

新しい制約で使用するかっこで指定された列または列の一覧。

[ ASC |DESC ]

テーブル制約に参加している 1 つ以上の列が並べ替えられる順序を指定します。 既定では、昇順の並べ替え順序 (ASC)。

フィルファクター = フィルファクター

データベース エンジンがインデックス データの格納に各インデックス ページを使用する方法を指定します。 ユーザーが指定できる fillfactor の値は、1 ~ 100 です。 値を指定しない場合、既定値は 0 になります。

下位互換性のために、このドキュメントには、PRIMARY KEY制約またはUNIQUE制約に適用される唯一のインデックス オプションとしてWITH FILLFACTOR = <fillfactor>が含まれています。 この構文は、今後のリリースでは文書化されません。 他のインデックス オプションはALTER TABLEの index_option 句で指定できます。

ON { partition_scheme_name(partition_column_name) | filegroup|"default" }

Applies to: SQL Server 2008 (10.0.x) 以降のバージョン。

制約に対して作成されるインデックスの格納場所を指定します。 partition_scheme_nameを指定した場合、インデックスはパーティション分割され、パーティションは指定したファイル グループpartition_scheme_nameマップされます。 ファイル グループを指定すると、名前付きファイル グループにインデックスが作成されます。 "default" を指定した場合、またはONをまったく指定しない場合、インデックスはテーブルと同じファイル グループに作成されます。 PRIMARY KEY制約またはUNIQUE制約のクラスター化インデックスを追加するときにONを指定すると、クラスター化インデックスの作成時にテーブル全体が指定したファイル グループに移動されます。

このコンテキストでは、既定値はキーワードではありません。これは既定のファイル グループの識別子であり、 ON"default" または ON[default]のように区切る必要があります。 "default" を指定する場合は、現在のセッションに対してQUOTED_IDENTIFIER オプションをONする必要があります。 これが既定の設定です。

外部キー参照

列内のデータの参照整合性を提供する制約。 FOREIGN KEY 制約では、列の各値が参照先テーブルの指定された列に存在する必要があります。

referenced_table_name

FOREIGN KEY制約によって参照されるテーブル。

ref_column

新しい FOREIGN KEY 制約によって参照されるかっこ内の列または列の一覧。

ON DELETE { NO ACTION |CASCADE |SET NULL |SET DEFAULT }

変更するテーブル内の行に対するアクションを指定します。これらの行に参照リレーションシップがあり、参照先の行を親テーブルから削除する場合です。 既定値は、NO ACTION です。

アクションなし

SQL Server データベース エンジンはエラーを発生させ、親テーブルの行に対する削除アクションをロールバックします。

CASCADE

親テーブルからその行を削除する場合は、参照元テーブルから対応する行を削除します。

セット・ヌル

親テーブルの対応する行を削除するときに、外部キーを構成するすべての値を NULL するように設定します。 この制約を実行するには、外部キー列が NULL 値を使用できる必要があります。

デフォルト設定

親テーブルの対応する行を削除するときに、外部キーを構成するすべての値を既定値に設定します。 この制約を実行するには、すべての外部キー列に既定値が定義されている必要があります。 列が null 許容であり、明示的な既定値が設定されていない場合、 NULL は列の暗黙的な既定値になります。

論理レコードを使用するマージ パブリケーションにテーブルが含まれている場合は、 CASCADE を指定しないでください。 論理レコードの詳細については、「論理レコードによる関連行への変更をグループ化」を参照してください。

INSTEAD OF トリガーON DELETE変更中のテーブルに既に存在する場合、ON DELETE CASCADEを定義することはできません。

たとえば、AdventureWorks2025 データベースで、ProductVendor テーブルに Vendor テーブルとの参照関係があるとします。 ProductVendor.VendorID 外部キーでは Vendor.VendorID 主キーを参照します。

Vendor テーブルの行に対して DELETE ステートメントを実行し、ON DELETE CASCADE に対して ON DELETE CASCADE アクションを指定すると、データベース エンジンは ProductVendor テーブル内の 1 つ以上の依存行をチェックします。 存在する場合は、Vendor テーブルで参照されている行に加えて、ProductVendor テーブル内の依存行も削除されます。

逆に、NO ACTION を指定した場合、データベース エンジンはエラーを発生させ、ProductVendor テーブルに少なくとも 1 つの行が存在するときに、Vendor 行の削除アクションをロールバックします。

ON UPDATE { NO ACTION |CASCADE |SET NULL |SET DEFAULT }

テーブル内の行が参照リレーションシップを持ち、親テーブルの参照先行を更新したときに変更するアクションを指定します。 既定値は、NO ACTION です。

アクションなし

データベース エンジンによってエラーが発生し、親テーブルの行に対する更新アクションがロールバックされます。

CASCADE

親テーブルで行が更新された場合に、参照元のテーブルでも対応する行が更新されます。

セット・ヌル

親テーブルの対応する行を更新するときに、外部キーを構成するすべての値を NULL に設定します。 この制約を実行するには、外部キー列が NULL 値を使用できる必要があります。

デフォルト設定

親テーブルの対応する行が更新された場合、外部キーを形成するすべての値が既定値に設定されます。 この制約を実行するには、すべての外部キー列に既定値が定義されている必要があります。 列が null 許容であり、明示的な既定値が設定されていない場合、 NULL は列の暗黙的な既定値になります。

論理レコードを使用するマージ パブリケーションにテーブルが含まれている場合は、 CASCADE を指定しないでください。 論理レコードの詳細については、「論理レコードによる関連行への変更をグループ化」を参照してください。

ON UPDATE CASCADESET NULL、または SET DEFAULT は、変更中のテーブルに INSTEAD OF トリガー ON UPDATE が既に存在する場合は定義できません。

たとえば、AdventureWorks2025 データベースで、ProductVendor テーブルに Vendor テーブルとの参照関係があるとします。 ProductVendor.VendorID 外部キーでは Vendor.VendorID 主キーを参照します。

Vendor テーブルの行に対して UPDATE ステートメントを実行し、ProductVendor.VendorID に対して ON UPDATE CASCADE アクションを指定すると、データベース エンジンは ProductVendor テーブル内の 1 つ以上の依存行をチェックします。 存在する場合は、 ProductVendor テーブル内の依存行と、 Vendor テーブルで参照されている行が更新されます。

逆に、NO ACTION を指定した場合、データベース エンジンはエラーを発生させ、ProductVendor テーブル内に少なくとも 1 つの行がある場合に、Vendor 行に対する更新アクションをロールバックします。

レプリケーション用ではありません

Applies to: SQL Server 2008 (10.0.x) 以降のバージョン。

制約にこの句を指定した場合、レプリケーション エージェントは書き込み操作を実行するときに制約を適用しません。 この句は、 FOREIGN KEY 制約と CHECK 制約に指定できます。

CONNECTION

指定されたエッジ制約で接続が許可されるノード テーブルのペアを指定します。 ON DELETE は、エッジが接続するノードが削除されたときに、エッジ テーブル内の行に対して何が起こるかを指定します。

DEFAULT

列の既定値を指定します。 DEFAULT定義を使用して、既存のデータ行の新しい列の値を指定します。 タイムスタンプ データ型、IDENTITY プロパティ、既存のDEFAULT定義、またはバインドされた既定値を持つ列にDEFAULT定義を追加することはできません。 列に既存の既定値がある場合は、新しい既定値を追加する前に既定値を削除する必要があります。 ユーザー定義型の列に既定値を指定する場合、型は constant_expression からユーザー定義型への暗黙的な変換をサポートする必要があります。 以前のバージョンのSQL Serverとの互換性を維持するために、制約名を DEFAULT に割り当てることができます。

constant_expression

既定の列値として使用するリテラル値、 NULL、またはシステム関数。 constant_expressionをMicrosoft .NET Framework ユーザー定義型として定義された列と組み合わせて使用する場合、型の実装では、constant_expression からユーザー定義型への暗黙的な変換がサポートされている必要があります。

FOR 列

テーブル レベルの DEFAULT 定義に関連付けられている列を指定します。

価値付き

  • 列と DEFAULT 制約を追加するときに、列で null が許可されている場合、 WITH VALUES を使用すると、既存の行の新しい列の値が DEFAULTconstant_expression で指定された値に設定されます。

  • 追加する列で null 値が許可されていない場合、既存の行の列の値は常に、 DEFAULTconstant 式で指定された値に設定されます。

SQL Server 2012 以降のバージョンでは、この操作はメタデータ操作 adding-not-null-columns-as-an-online-operation にすることができます。

関連する列も追加されていないときに WITH VALUES を使用する場合、効果はありません。

CHECK

1 つ以上の列に入力できる値を制限することによってドメインの整合性を設定する制約。

logical_expression

TRUEまたはFALSEを返すCHECK制約で使用される論理式。 CHECK 制約で使用logical_expression、別のテーブルを参照することはできませんが、同じ行に対して同じテーブル内の他の列を参照できます。 式は別名データ型を参照できません。

Remarks

FOREIGN KEY制約またはCHECK制約を追加すると、WITH NOCHECK オプションを指定しない限り、既存のすべてのデータで制約違反がチェックされます。 違反が発生した場合、 ALTER TABLE は失敗し、エラーが返されます。 既存の列に新しい PRIMARY KEY または UNIQUE 制約を追加する場合、列または列のデータは一意である必要があります。 重複する値が見つかった場合、 ALTER TABLE は失敗します。 PRIMARY KEY制約またはUNIQUE制約を追加しても、WITH NOCHECK オプションは無効です。

PRIMARY KEY 制約と UNIQUE 制約によってインデックスが生成されます。 UNIQUE制約とPRIMARY KEY制約の数によって、テーブルのインデックスの数が 999 個の非クラスター化インデックスと 1 つのクラスター化インデックスを超えることはできません。 外部キー制約では、インデックスは自動的に生成されません。 ただし、一方のテーブルの外部キー制約の列または列を他のテーブルの主キー列または一意キー列と照合することで、クエリの結合条件で外部キー列を頻繁に使用します。 外部キー列のインデックスを使用すると、データベース エンジンは外部キー テーブル内の関連データをすばやく検索できます。

SQL Server 2022 (16.x) 以降のバージョンでは、再開可能な操作では、主キー制約と一意キー制約のテーブル制約の追加がサポートされています。 再開可能な ALTER TABLE ADD CONSTRAINT 操作の有効化と使用の詳細については、「再開可能なテーブル制約の追加」を参照してください。

Microsoft Fabricのウェアハウスでは、ADD または DROPPRIMARY KEYUNIQUE、および FOREIGN_KEY 列の制約がサポートされますが、NOT ENFORCED オプションを指定した場合に限ります。 Microsoft Fabric内のウェアハウスは、他のすべてのALTER TABLE操作をブロックします。

Examples

例については、「ALTER TABLE (Transact-SQL)を参照してください。