ALTER TABLE column_constraint (Transact-SQL)ALTER TABLE column_constraint (Transact-SQL)

適用対象: ○SQL Server ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

ALTER TABLE を使用してテーブルに追加された新しい列定義の一部になっている PRIMARY KEY、FOREIGN KEY、UNIQUE、または CHECK 制約のプロパティを指定します。Specifies the properties of a PRIMARY KEY, FOREIGN KEY, UNIQUE, or CHECK constraint that is part of a new column definition added to a table by using ALTER TABLE.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

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

引数Arguments

CONSTRAINTCONSTRAINT
PRIMARY KEY、UNIQUE、FOREIGN KEY、または CHECK 制約の定義の開始を指定します。Specifies the start of the definition for a PRIMARY KEY, UNIQUE, FOREIGN KEY, or CHECK constraint.

constraint_nameconstraint_name
制約の名前を指定します。Is the name of the constraint. 制約名は識別子の規則に従う必要があります。ただし、番号記号 (#) で始めることはできません。Constraint names must follow the rules for identifiers, except that the name cannot start with a number sign (#). constraint_name を指定しない場合、この制約にはシステムによって生成された名前が割り当てられます。If constraint_name is not supplied, a system-generated name is assigned to the constraint.

NULL | NOT NULLNULL | NOT NULL
列で NULL 値が許容されるかどうかを指定します。Specifies whether the column can accept null values. NULL 値を許可しない列は、既定値が指定されているときだけ追加できます。Columns that do not allow null values can be added only if they have a default specified. 新規列が NULL 値を許可し、既定値が指定されていない場合は、テーブル内のすべての行で、新しい列は NULL 値を格納します。If the new column allows null values and no default is specified, the new column contains NULL for each row in the table. 新規列が NULL 値を許可し、新規列と共に既定の定義が追加される場合、WITH VALUES オプションを使用して、テーブル内の既存の各行の新規列に既定値を格納できます。If the new column allows null values and a default definition is added with the new column, the WITH VALUES option can be used to store the default value in the new column for each existing row in the table.

新規列が NULL 値を許可しない場合、新規列と共に DEFAULT 定義を追加する必要があります。If the new column does not allow null values, a DEFAULT definition must be added with the new column. 新規列は、各既存の行の新規列に既定値と共に自動で読み込まれます。The new column automatically loads with the default value in the new columns in each existing row.

列の追加を行うときにテーブルのデータ行に物理的な変更が必要な場合 (各行への DEFAULT 値の追加など)、ALTER TABLE の実行中、ロックはテーブルで保持されます。When the addition of a column requires physical changes to the data rows of a table, such as adding DEFAULT values to each row, locks are held on the table while ALTER TABLE runs. これは、ロックが適用されている間にテーブルの内容を変更する機能に影響します。This affects the ability to change the content of the table while the lock is in place. 一方、NULL 値を許可し、既定値を指定しない列の追加は、メタデータ操作に限られ、ロックは関係しません。In contrast, adding a column that allows null values and does not specify a default value is a metadata operation only, and involves no locks.

CREATE TABLE または ALTER TABLE を使用すると、データベースとセッションの設定は、列定義で使われているデータ型に NULL 値を許すかどうかの設定に影響を及ぼし、場合によっては、NULL 値を許すかどうかの設定をオーバーライドします。When you use CREATE TABLE or ALTER TABLE, database and session settings influence and possibly override the nullability of the data type that is used in a column definition. 計算列ではない場合は、常に列を明示的に NULL または NOT NULL として定義することをお勧めします。ユーザー定義データ型を使用する場合は、データ型に NULL 値を許すかどうかの既定の設定を列が使用できるようにすることをお勧めします。We recommend that you always explicitly define noncomputed columns as NULL or NOT NULL or, if you use a user-defined data type, that you allow the column to use the default nullability of the data type. 詳細については、「CREATE TABLE (Transact-SQL)」を参照してください。For more information, see CREATE TABLE (Transact-SQL).

PRIMARY KEYPRIMARY KEY
一意のインデックスを使用して、指定した 1 つ以上の列にエンティティの整合性を強制する制約です。Is a constraint that enforces entity integrity for a specified column or columns by using a unique index. PRIMARY KEY 制約は 1 つのテーブルに対して 1 つだけ作成できます。Only one PRIMARY KEY constraint can be created for each table.

UNIQUEUNIQUE
一意なインデックスによって、特定の 1 つ以上の列にエンティティの整合性を提供する制約です。Is a constraint that provides entity integrity for a specified column or columns by using a unique index.

CLUSTERED | NONCLUSTEREDCLUSTERED | NONCLUSTERED
PRIMARY KEY 制約または UNIQUE 制約に対して、クラスター化インデックスまたは非クラスター化インデックスを作成することを指定します。Specifies that a clustered or nonclustered index is created for the PRIMARY KEY or UNIQUE constraint. PRIMARY KEY 制約は既定では CLUSTERED です。PRIMARY KEY constraints default to CLUSTERED. UNIQUE 制約の既定値は NONCLUSTERED です。UNIQUE constraints default to NONCLUSTERED.

テーブルに既存のクラスター化制約またはクラスター化インデックスがある場合、CLUSTERED は指定できません。If a clustered constraint or index already exists on a table, CLUSTERED cannot be specified. テーブルにクラスター化制約またはクラスター化インデックスが既に存在する場合、PRIMARY KEY 制約には既定で NONCLUSTERED が適用されます。If a clustered constraint or index already exists on a table, PRIMARY KEY constraints default to NONCLUSTERED.

ntexttextvarchar(max)nvarchar(max)varbinary(max)xmlimage データ型の列を、インデックスの列として指定することはできません。Columns that are of the ntext, text, varchar(max), nvarchar(max), varbinary(max), xml, or image data types cannot be specified as columns for an index.

WITH FILLFACTOR =fillfactorWITH FILLFACTOR =fillfactor
インデックス データの格納に使用される個々のインデックス ページを データベース エンジンDatabase Engine がどの程度埋めるかを指定します。Specifies how full the データベース エンジンDatabase Engine should make each index page used to store the index data. ユーザー定義の FILL FACTOR 値は、1 ~ 100 の範囲で指定できます。User-specified fill factor values can be from 1 through 100. 値を指定しない場合の既定値は 0 です。If a value is not specified, the default is 0.

重要

マニュアルには、WITH FILLFACTOR = fillfactor が PRIMARY KEY 制約または UNIQUE 制約に適用される唯一のインデックス オプションとして記述されていますが、これは旧バージョンとの互換性を維持するために記載されており、将来のリリースではこのような記述はなくなります。Documenting WITH FILLFACTOR = fillfactor as the only index option that applies to PRIMARY KEY or UNIQUE constraints is maintained for backward compatibility, but will not be documented in this manner in future releases. ALTER TABLE の index_option 句で他のインデックス オプションも指定できます。Other index options can be specified in the index_option clause of ALTER TABLE.

ON { partition_scheme_name(partition_column_name) | filegroup | " default " } 適用対象: SQL Server 2008SQL Server 2008 から SQL Server 2017SQL Server 2017ON { partition_scheme_name(partition_column_name) | filegroup | " default " } Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

制約に対して作成されるインデックスの格納場所を指定します。Specifies the storage location of the index created for the constraint. partition_scheme_name を指定した場合、インデックスがパーティション分割され、分割後のパーティションは partition_scheme_name で指定したファイル グループにマップされます。If partition_scheme_name is specified, the index is partitioned and the partitions are mapped to the filegroups that are specified by partition_scheme_name. filegroup を指定すると、インデックスは指定されたファイル グループに作成されます。If filegroup is specified, the index is created in the named filegroup. " default " を指定するか、ON を指定しなかった場合、インデックスはテーブルと同じファイル グループに作成されます。If " default " is specified or if ON is not specified at all, the index is created in the same filegroup as the table. PRIMARY KEY 制約または UNIQUE 制約のクラスター化インデックスを追加する場合に ON を指定すると、クラスター化インデックスの作成時に、指定したファイル グループにテーブル全体が移動します。If ON is specified when a clustered index is added for a PRIMARY KEY or UNIQUE constraint, the whole table is moved to the specified filegroup when the clustered index is created.

ここでは、default はキーワードではありません。In this context, default, is not a keyword. default は、既定ファイル グループの識別子なので、ON " default " または ON [ default ] のように区切る必要があります。It is an identifier for the default filegroup and must be delimited, as in ON " default " or ON [ default ]. " default " を指定する場合は、現在のセッションに対して QUOTED_IDENTIFIER オプションが ON になっている必要があります。If " default " is specified, the QUOTED_IDENTIFIER option must be ON for the current session. これが既定の設定です。This is the default setting. 詳細については、「SET QUOTED_IDENTIFIER (Transact-SQL)」をご覧ください。For more information, see SET QUOTED_IDENTIFIER (Transact-SQL).

FOREIGN KEY REFERENCESFOREIGN KEY REFERENCES
列内のデータに対して参照整合性を提供する制約です。Is a constraint that provides referential integrity for the data in the column. FOREIGN KEY 制約では、列内の各値が、参照テーブル内の指定された列に含まれていることが必要となります。FOREIGN KEY constraints require that each value in the column exist in the specified column in the referenced table.

schema_nameschema_name
FOREIGN KEY 制約が参照するテーブルが属するスキーマの名前です。Is the name of the schema to which the table referenced by the FOREIGN KEY constraint belongs.

referenced_table_namereferenced_table_name
FOREIGN KEY 制約によって参照されるテーブルを指定します。Is the table referenced by the FOREIGN KEY constraint.

ref_columnref_column
新しい FOREIGN KEY 制約によって参照される、かっこで囲んだ列です。Is a column in parentheses referenced by the new FOREIGN KEY constraint.

ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
変更対象のテーブル内の行に参照関係があり、参照先の行が親テーブルから削除された場合に、変更対象のテーブル内の行に対して実行する操作を指定します。Specifies what action happens to rows in the table that is altered, if those rows have a referential relationship and the referenced row is deleted from the parent table. 既定値は NO ACTION です。The default is NO ACTION.

NO ACTIONNO ACTION
SQL Server データベース エンジンSQL Server Database Engine がエラーを生成し、親テーブルでの行の削除操作がロールバックされます。The SQL Server データベース エンジンSQL Server Database Engine raises an error and the delete action on the row in the parent table is rolled back.

CASCADECASCADE
親テーブルから行が削除された場合に、参照元テーブルからもその行が削除されます。Corresponding rows are deleted from the referencing table if that row is deleted from the parent table.

SET NULLSET NULL
親テーブルの対応する行が削除された場合、外部キーを形成するすべての値が NULL に設定されます。All the values that make up the foreign key are set to NULL when the corresponding row in the parent table is deleted. この制約を実行するには、外部キー列が NULL 値を使用できる必要があります。For this constraint to execute, the foreign key columns must be nullable.

SET DEFAULTSET DEFAULT
親テーブルの対応する行が削除された場合、外部キーを形成するすべての値が既定値に設定されます。All the values that comprise the foreign key are set to their default values when the corresponding row in the parent table is deleted. この制約を実行するには、すべての外部キー列に既定値が定義されている必要があります。For this constraint to execute, all foreign key columns must have default definitions. 列で NULL 値が許容されており、既定値が明示的に設定されていない場合、NULL が列の暗黙的な既定値になります。If a column is nullable and there is no explicit default value set, NULL becomes the implicit default value of the column.

論理レコードを使用するマージ パブリケーションにテーブルを含める場合、CASCADE は使用しないでください。Do not specify CASCADE if the table will be included in a merge publication that uses logical records. 論理レコードの詳細については、「論理レコードによる関連行への変更をグループ化」を参照してください。For more information about logical records, see Group Changes to Related Rows with Logical Records.

変更対象のテーブルに ON DELETE での INSTEAD OF トリガーが既に存在する場合は、ON DELETE CASCADE を定義できません。The ON DELETE CASCADE cannot be defined if an INSTEAD OF trigger ON DELETE already exists on the table that is being altered.

たとえば、AdventureWorks2012AdventureWorks2012 データベースで、ProductVendor テーブルに Vendor テーブルとの参照関係があるとします。For example, in the AdventureWorks2012AdventureWorks2012 database, the ProductVendor table has a referential relationship with the Vendor table. ここで、ProductVendor.VendorID 外部キーは Vendor.VendorID 主キーを参照します。The ProductVendor.VendorID foreign key references the Vendor.VendorID primary key.

Vendor テーブルの行に対して DELETE ステートメントを実行し、ProductVendor.VendorID に対して ON DELETE CASCADE アクションが指定されている場合は、データベース エンジンDatabase EngineProductVendor テーブルの 1 つ以上の従属行を調べます。If a DELETE statement is executed on a row in the Vendor table, and an ON DELETE CASCADE action is specified for ProductVendor.VendorID, the データベース エンジンDatabase Engine checks for one or more dependent rows in the ProductVendor table. 従属行がある場合、ProductVendor テーブルの従属行が、Vendor テーブルで参照される行と共に削除されます。If any exist, the dependent rows in the ProductVendor table will be deleted, in addition to the row referenced in the Vendor table.

これに対し、NO ACTION を指定した場合は、ProductVendor テーブルに Vendor テーブルの行を参照する行が 1 つでもあると、データベース エンジンDatabase Engine ではエラーが発生し、Vendor テーブルの行に対する削除操作はロールバックされます。Conversely, if NO ACTION is specified, the データベース エンジンDatabase Engine raises an error and rolls back the delete action on the Vendor row when there is at least one row in the ProductVendor table that references it.

ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
変更対象のテーブル内の行が参照関係を持ち、親テーブルで参照先の行が更新された場合、変更対象のテーブル内の行に対して発生する操作を指定します。Specifies what action happens to rows in the table altered when those rows have a referential relationship and the referenced row is updated in the parent table. 既定値は NO ACTION です。The default is NO ACTION.

NO ACTIONNO ACTION
NO ACTION を指定すると、データベース エンジンDatabase Engineでエラーが発生し、親テーブルの行の更新操作はロールバックされます。The データベース エンジンDatabase Engine raises an error, and the update action on the row in the parent table is rolled back.

CASCADECASCADE
親テーブルで行が更新された場合に、参照元のテーブルでも対応する行が更新されます。Corresponding rows are updated in the referencing table when that row is updated in the parent table.

SET NULLSET NULL
親テーブルの対応する行が更新された場合、外部キーを形成するすべての値が NULL に設定されます。All the values that make up the foreign key are set to NULL when the corresponding row in the parent table is updated. この制約を実行するには、外部キー列が NULL 値を使用できる必要があります。For this constraint to execute, the foreign key columns must be nullable.

SET DEFAULTSET DEFAULT
親テーブルの対応する行が更新された場合、外部キーを形成するすべての値が既定値に設定されます。All the values that make up the foreign key are set to their default values when the corresponding row in the parent table is updated. この制約を実行するには、すべての外部キー列に既定値が定義されている必要があります。For this constraint to execute, all foreign key columns must have default definitions. 列で NULL 値が許容されており、既定値が明示的に設定されていない場合、NULL が列の暗黙的な既定値になります。If a column is nullable and there is no explicit default value set, NULL becomes the implicit default value of the column.

論理レコードを使用するマージ パブリケーションにテーブルを含める場合、CASCADE は使用しないでください。Do not specify CASCADE if the table will be included in a merge publication that uses logical records. 論理レコードの詳細については、「論理レコードによる関連行への変更をグループ化」を参照してください。For more information about logical records, see Group Changes to Related Rows with Logical Records.

変更対象のテーブルに ON UPDATE での INSTEAD OF トリガーが既に存在する場合は、ON UPDATE CASCADE、SET NULL、または SET DEFAULT を定義できません。ON UPDATE CASCADE, SET NULL, or SET DEFAULT cannot be defined if an INSTEAD OF trigger ON UPDATE already exists on the table that is being altered.

たとえば、AdventureWorks2012AdventureWorks2012 データベースで、ProductVendor テーブルに Vendor テーブルとの参照関係があるとします。For example, in the AdventureWorks2012AdventureWorks2012 database, the ProductVendor table has a referential relationship with the Vendor table. ここで、ProductVendor.VendorID 外部キーは Vendor.VendorID 主キーを参照します。The ProductVendor.VendorID foreign key references the Vendor.VendorID primary key.

UPDATE ステートメントを Vendor テーブルの行で実行した場合、ON UPDATE CASCADE 操作が ProductVendor.VendorID に指定されていると、データベース エンジンDatabase Engine では ProductVendor テーブルに 1 つ以上の従属行があるかどうかが確認されます。If an UPDATE statement is executed on a row in the Vendor table and an ON UPDATE CASCADE action is specified for ProductVendor.VendorID, the データベース エンジンDatabase Engine checks for one or more dependent rows in the ProductVendor table. 従属行がある場合、ProductVendor テーブルの従属行が、Vendor テーブルで参照される行と共に更新されます。If any exist, the dependent row in the ProductVendor table will be updated, in addition to the row referenced in the Vendor table.

これに対して、NO ACTION を指定した場合は、ProductVendor テーブルに Vendor テーブルの行を参照する行が 1 つでもあると、データベース エンジンDatabase Engine ではエラーが発生し、Vendor テーブルの行に対する更新操作はロールバックされます。Conversely, if NO ACTION is specified, the データベース エンジンDatabase Engine raises an error and rolls back the update action on the Vendor row when there is at least one row in the ProductVendor table that references it.

NOT FOR REPLICATIONNOT FOR REPLICATION
適用対象: SQL Server 2008SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

FOREIGN KEY 制約と CHECK 制約に対して指定できます。Can be specified for FOREIGN KEY constraints and CHECK constraints. 制約でこの句を指定すると、レプリケーション エージェントが挿入、更新、削除操作を行う際に制約が適用されません。If this clause is specified for a constraint, the constraint is not enforced when replication agents perform insert, update, or delete operations.

CHECKCHECK
1 つ以上の列に入力できる値を制限することによってドメインの整合性を設定する制約です。Is a constraint that enforces domain integrity by limiting the possible values that can be entered into a column or columns.

logical_expressionlogical_expression
CHECK 制約で使用する論理式を指定します。この式は TRUE または FALSE を返します。Is a logical expression used in a CHECK constraint and returns TRUE or FALSE. CHECK 制約と共に使用する logical_expression では他のテーブルを参照できませんが、同じテーブルで同じ行の他の列は参照できます。logical_expression used with CHECK constraints cannot reference another table but can reference other columns in the same table for the same row. この式では別名データ型は参照できません。The expression cannot reference an alias data type.

RemarksRemarks

FOREIGN 制約または CHECK 制約を追加すると、WITH NOCHECK オプションが指定されない限り、既存のすべてのデータに対して、制約違反の確認が行われます。When FOREIGN KEY or CHECK constraints are added, all existing data is verified for constraint violations unless the WITH NOCHECK option is specified. 違反がある場合、ALTER TABLE は失敗し、エラーが返されます。If any violations occur, ALTER TABLE fails and an error is returned. 既存の列に新しい PRIMARY KEY 制約または UNIQUE 制約を追加するとき、列内のデータは一意であることが必要です。When a new PRIMARY KEY or UNIQUE constraint is added to an existing column, the data in the column or columns must be unique. 重複する値が見つかると、ALTER TABLE は失敗します。If duplicate values are found, ALTER TABLE fails. PRIMARY KEY 制約または UNIQUE 制約を追加する場合、WITH NOCHECK オプションによる影響はありません。The WITH NOCHECK option has no effect when PRIMARY KEY or UNIQUE constraints are added.

PRIMARY KEY 制約と UNIQUE 制約では、それぞれインデックスが生成されます。Each PRIMARY KEY and UNIQUE constraint generates an index. UNIQUE 制約と PRIMARY KEY 制約によって生成されるテーブル上のインデックスの個数は、999 個の非クラスター化インデックスと 1 つのクラスター化インデックスに収まる必要があります。The number of UNIQUE and PRIMARY KEY constraints cannot cause the number of indexes on the table to exceed 999 nonclustered indexes and 1 clustered index. 外部キー制約では、自動的にインデックスが生成されることはありません。Foreign key constraints do not automatically generate an index. ただし、クエリ内で、一方のテーブルの外部キー制約内の列を、他方のテーブルの主キー列または一意なキー列と照合することによって、クエリ内の結合条件で外部キー列は頻繁に使用されます。However, foreign key columns are frequently used in join criteria in queries by matching the column or columns in the foreign key constraint of one table with the primary or unique key column or columns in the other table. 外部キー列のインデックスを使用すると、データベース エンジンDatabase Engineにより、外部キー テーブルの関連データがすばやく検索されます。An index on the foreign key columns enables the データベース エンジンDatabase Engine to quickly find related data in the foreign key table.

使用例Examples

例については、「ALTER TABLE (Transact-SQL)」を参照してください。For examples, see ALTER TABLE (Transact-SQL).

参照See Also

ALTER TABLE (Transact-SQL) ALTER TABLE (Transact-SQL)
column_definition (Transact-SQL)column_definition (Transact-SQL)