DataTable の制約DataTable Constraints

制約を使用すると、データの整合性を維持するために DataTable のデータを強制的に制限できます。You can use constraints to enforce restrictions on the data in a DataTable, in order to maintain the integrity of the data. 制約は、1 つの列または関連付けられた複数の列に対して自動的に適用される規則であり、行の値がなんらかの方法で変更されたときに実行されるアクションを決定します。A constraint is an automatic rule, applied to a column or related columns, that determines the course of action when the value of a row is somehow altered. のプロパティSystem.Data.DataSet.EnforceConstraintsがtrueの場合、制約が適用されます。 DataSetConstraints are enforced when the System.Data.DataSet.EnforceConstraints property of the DataSet is true. EnforceConstraints プロパティの設定方法のコード例については、EnforceConstraints のリファレンス トピックを参照してください。For a code example that shows how to set the EnforceConstraints property, see the EnforceConstraints reference topic.

ADO.NET には、ForeignKeyConstraintUniqueConstraint の 2 種類の制約があります。There are two kinds of constraints in ADO.NET: the ForeignKeyConstraint and the UniqueConstraint. 既定では、2つ以上のテーブル間のリレーションシップを作成するときに、データセットDataRelationを追加することによって、両方の制約が自動的に作成されます。By default, both constraints are created automatically when you create a relationship between two or more tables by adding a DataRelation to the DataSet. ただし、リレーションシップの作成時にcreateConstraints = falseを指定することで、この動作を無効にすることができます。However, you can disable this behavior by specifying createConstraints = false when creating the relation.

ForeignKeyConstraintForeignKeyConstraint

ForeignKeyConstraintは、関連テーブルの更新と削除がどのように反映されるかに関する規則を適用します。A ForeignKeyConstraint enforces rules about how updates and deletes to related tables are propagated. たとえば、1つのテーブルの行の値が更新または削除され、その同じ値が1つ以上の関連テーブルでも使用されている場合、 ForeignKeyConstraintは関連テーブルでの処理を決定します。For example, if a value in a row of one table is updated or deleted, and that same value is also used in one or more related tables, a ForeignKeyConstraint determines what happens in the related tables.

ForeignKeyConstraint DeleteRuleUpdateRuleプロパティとプロパティは、ユーザーが関連テーブル内の行を削除または更新しようとしたときに実行されるアクションを定義します。The DeleteRule and UpdateRule properties of the ForeignKeyConstraint define the action to be taken when the user attempts to delete or update a row in a related table. 次の表では、 ForeignKeyConstraintDeleteRuleプロパティとUpdateRuleプロパティで使用できるさまざまな設定について説明します。The following table describes the different settings available for the DeleteRule and UpdateRule properties of the ForeignKeyConstraint.

規則の設定Rule setting 説明Description
CascadeCascade 関連付けられている行を削除または更新します。Delete or update related rows.
SetNullSetNull 関連する行の値をDBNullに設定します。Set values in related rows to DBNull.
SetDefaultSetDefault 関連付けられている行の値を既定値に設定します。Set values in related rows to the default value.
NoneNone 関連付けられている行に対してアクションは実行しません。Take no action on related rows. 既定値です。This is the default.

ForeignKeyConstraintを使用すると、関連する列に対する変更を制限および反映することができます。A ForeignKeyConstraint can restrict, as well as propagate, changes to related columns. 列のForeignKeyConstraintに設定されているプロパティによっては、データセットEnforceConstraintsプロパティがtrueの場合、親行に対して特定の操作を実行すると例外が発生します。Depending on the properties set for the ForeignKeyConstraint of a column, if the EnforceConstraints property of the DataSet is true, performing certain operations on the parent row will result in an exception. たとえば、 ForeignKeyConstraintDeleteRuleプロパティがNoneの場合、子行がある場合、親行を削除することはできません。For example, if the DeleteRule property of the ForeignKeyConstraint is None, a parent row cannot be deleted if it has any child rows.

ForeignKeyConstraintコンストラクターを使用して、単一の列間または列の配列間の foreign key 制約を作成できます。You can create a foreign key constraint between single columns or between an array of columns by using the ForeignKeyConstraint constructor. 結果のForeignKeyConstraintオブジェクトをテーブルのConstraintsプロパティのAddメソッド ( ConstraintCollection) に渡します。Pass the resulting ForeignKeyConstraint object to the Add method of the table's Constraints property, which is a ConstraintCollection. また、 ConstraintCollectionAddメソッドのいくつかのオーバーロードにコンストラクター引数を渡して、 ForeignKeyConstraintを作成することもできます。You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a ForeignKeyConstraint.

ForeignKeyConstraintを作成するときに、 DeleteRuleUpdateRuleの値を引数としてコンストラクターに渡すか、次の例のようにプロパティとして設定できます ( DeleteRuleの値がに設定されている場合)。なし)。When creating a ForeignKeyConstraint, you can pass the DeleteRule and UpdateRule values to the constructor as arguments, or you can set them as properties as in the following example (where the DeleteRule value is set to None).

Dim custOrderFK As ForeignKeyConstraint = New ForeignKeyConstraint("CustOrderFK", _  
  custDS.Tables("CustTable").Columns("CustomerID"), _  
  custDS.Tables("OrdersTable").Columns("CustomerID"))  
custOrderFK.DeleteRule = Rule.None    
' Cannot delete a customer value that has associated existing orders.  
custDS.Tables("OrdersTable").Constraints.Add(custOrderFK)  
ForeignKeyConstraint custOrderFK = new ForeignKeyConstraint("CustOrderFK",  
  custDS.Tables["CustTable"].Columns["CustomerID"],   
  custDS.Tables["OrdersTable"].Columns["CustomerID"]);  
custOrderFK.DeleteRule = Rule.None;    
// Cannot delete a customer value that has associated existing orders.  
custDS.Tables["OrdersTable"].Constraints.Add(custOrderFK);  

AcceptRejectRuleAcceptRejectRule

行への変更は、 AcceptChangesメソッドを使用して受け入れるか、 DataSetDataTable、またはDataRowRejectChangesメソッドを使用して取り消すことができます。Changes to rows can be accepted using the AcceptChanges method or canceled using the RejectChanges method of the DataSet, DataTable, or DataRow. データセットForeignKeyConstraintsが含まれている場合、 AcceptChangesメソッドまたはRejectChangesメソッドを呼び出すと、 AcceptRejectRuleが適用されます。When a DataSet contains ForeignKeyConstraints, invoking the AcceptChanges or RejectChanges methods enforces the AcceptRejectRule. ForeignKeyConstraintAcceptRejectRuleプロパティは、親行でAcceptChangesまたはRejectChangesが呼び出されたときに、子の行に対して実行されるアクションを決定します。The AcceptRejectRule property of the ForeignKeyConstraint determines which action will be taken on the child rows when AcceptChanges or RejectChanges is called on the parent row.

次の表に、 AcceptRejectRuleで使用可能な設定の一覧を示します。The following table lists the available settings for the AcceptRejectRule.

規則の設定Rule setting 説明Description
CascadeCascade 子の行への変更を受け入れるかまたは拒否します。Accept or reject changes to child rows.
NoneNone 子の行に対してアクションは実行しません。Take no action on child rows. 既定値です。This is the default.

Example

次の例では、ForeignKeyConstraint を作成し、AcceptRejectRule を含む複数のプロパティを設定して、ConstraintCollection オブジェクトの DataTable に追加します。The following example creates a ForeignKeyConstraint, sets several of its properties, including the AcceptRejectRule, and adds it to the ConstraintCollection of a DataTable object.

private void CreateConstraint(DataSet dataSet, 
    string table1, string table2,string column1, string column2)
{
   // Declare parent column and child column variables.
   DataColumn parentColumn;
   DataColumn childColumn;
   ForeignKeyConstraint foreignKeyConstraint;

   // Set parent and child column variables.
   parentColumn = dataSet.Tables[table1].Columns[column1];
   childColumn = dataSet.Tables[table2].Columns[column2];
   foreignKeyConstraint = new ForeignKeyConstraint
      ("SupplierForeignKeyConstraint",  parentColumn, childColumn);

   // Set null values when a value is deleted.
   foreignKeyConstraint.DeleteRule = Rule.SetNull;
   foreignKeyConstraint.UpdateRule = Rule.Cascade;
   foreignKeyConstraint.AcceptRejectRule = AcceptRejectRule.None;

   // Add the constraint, and set EnforceConstraints to true.
   dataSet.Tables[table1].Constraints.Add(foreignKeyConstraint);
   dataSet.EnforceConstraints = true;
}
Private Sub CreateConstraint(dataSet As DataSet, _
   table1 As String, table2 As String, _
   column1 As String, column2 As String)

   ' Declare parent column and child column variables.
   Dim parentColumn As DataColumn
   Dim childColumn As DataColumn
   Dim foreignKeyConstraint As ForeignKeyConstraint

   ' Set parent and child column variables.
   parentColumn = dataSet.Tables(table1).Columns(column1)
   childColumn = dataSet.Tables(table2).Columns(column2)
   foreignKeyConstraint = New ForeignKeyConstraint _
      ("SupplierForeignKeyConstraint", parentColumn, childColumn)

   ' Set null values when a value is deleted.
   foreignKeyConstraint.DeleteRule = Rule.SetNull
   foreignKeyConstraint.UpdateRule = Rule.Cascade
   foreignKeyConstraint.AcceptRejectRule = AcceptRejectRule.None

   ' Add the constraint, and set EnforceConstraints to true.
   dataSet.Tables(table1).Constraints.Add(foreignKeyConstraint)
   dataSet.EnforceConstraints = True
End Sub

UniqueConstraintUniqueConstraint

UniqueConstraintオブジェクトは、単一の列またはDataTable内の列の配列に割り当てることができます。これにより、指定された1つまたは複数の列のすべてのデータが行ごとに一意になります。The UniqueConstraint object, which can be assigned either to a single column or to an array of columns in a DataTable, ensures that all data in the specified column or columns is unique per row. UniqueConstraintコンストラクターを使用して、列または列の配列に unique 制約を作成できます。You can create a unique constraint for a column or array of columns by using the UniqueConstraint constructor. 結果のUniqueConstraintオブジェクトをテーブルのConstraintsプロパティのAddメソッド ( ConstraintCollection) に渡します。Pass the resulting UniqueConstraint object to the Add method of the table's Constraints property, which is a ConstraintCollection. また、 ConstraintCollectionAddメソッドのいくつかのオーバーロードにコンストラクター引数を渡して、 UniqueConstraintを作成することもできます。You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a UniqueConstraint. 1つまたは複数の列に対してUniqueConstraintを作成する場合は、必要に応じて、列または列が主キーであるかどうかを指定できます。When creating a UniqueConstraint for a column or columns, you can optionally specify whether the column or columns are a primary key.

列のuniqueプロパティをtrueに設定することによって、列に unique 制約を作成することもできます。You can also create a unique constraint for a column by setting the Unique property of the column to true. または、1つの列のuniqueプロパティをfalseに設定すると、存在する可能性がある一意の制約が削除されます。Alternatively, setting the Unique property of a single column to false removes any unique constraint that may exist. 1 つの列 (または複数の列) をテーブルの主キーとして定義すると、指定した列 (または複数の列) の UNIQUE 制約が自動的に作成されます。Defining a column or columns as the primary key for a table will automatically create a unique constraint for the specified column or columns. DataTablePrimaryKeyプロパティから列を削除すると、 UniqueConstraintが削除されます。If you remove a column from the PrimaryKey property of a DataTable, the UniqueConstraint is removed.

次の例では、 DataTableの2つの列に対してUniqueConstraintを作成します。The following example creates a UniqueConstraint for two columns of a DataTable.

Dim custTable As DataTable = custDS.Tables("Customers")  
Dim custUnique As UniqueConstraint = _  
    New UniqueConstraint(New DataColumn()   {custTable.Columns("CustomerID"), _  
    custTable.Columns("CompanyName")})  
custDS.Tables("Customers").Constraints.Add(custUnique)  
DataTable custTable = custDS.Tables["Customers"];  
UniqueConstraint custUnique = new UniqueConstraint(new DataColumn[]   
    {custTable.Columns["CustomerID"],   
    custTable.Columns["CompanyName"]});  
custDS.Tables["Customers"].Constraints.Add(custUnique);  

関連項目See also