Compartir a través de


Agregar restricciones a una tabla

Se puede usar la propiedad Constraints para imponer restricciones sobre los datos de un objeto DataTable con el fin de mantener la integridad de los datos. Una restricción es una regla automática que se aplica a una columna, o a varias columnas relacionadas, que determina cómo proceder cuando se modifica de alguna manera el valor de una fila. Las restricciones se exigen cuando la propiedad EnforceConstraints del DataSet es true.

En ADO .NET existen dos tipos de restricciones: ForeignKeyConstraint y UniqueConstraint. De forma predeterminada, las dos restricciones se crean automáticamente al crear una relación entre dos o más tablas agregando DataRelation al DataSet. Sin embargo, se puede deshabilitar este comportamiento especificando createConstraints = false al crear la relación.

ForeignKeyConstraint

ForeignKeyConstraint impone reglas sobre cómo se propagan las actualizaciones y eliminaciones a las tablas relacionadas. Por ejemplo, si se actualiza o elimina el valor de una fila de una tabla y el mismo valor también se usa en una o varias tablas relacionadas, ForeignKeyConstraint determinará qué sucede en las tablas relacionadas.

Las propiedades DeleteRule y UpdateRule de ForeignKeyConstraint definen la acción que se ha de realizar cuando el usuario intente eliminar o actualizar una fila en una tabla relacionada. En la tabla siguiente se describen las distintas configuraciones disponibles para las propiedades DeleteRule y UpdateRule de ForeignKeyConstraint

Regla Descripción
Cascade Elimina o actualiza las filas relacionadas. Éste es el valor predeterminado.
SetNull Establece los valores de las filas relacionadas en DBNull.
SetDefault Establece los valores de las filas relacionadas en el valor predeterminado.
None Especifica que no se tome ninguna acción en las filas relacionadas.

ForeignKeyConstraint puede restringir, además de propagar, los cambios en las columnas relacionadas. Dependiendo de las propiedades establecidas para la ForeignKeyConstraint de una columna, y si la propiedad EnforceConstraints del DataSet es true, realizar ciertas operaciones en la fila primaria generará una excepción. Por ejemplo, si la propiedad DeleteRule de ForeignKeyConstraint es None, una fila primaria no se puede eliminar si tiene filas secundarias.

Se puede crear una restricción de clave externa entre columnas individuales o entre una matriz de columnas usando el constructor ForeignKeyConstraint. Pase el objeto ForeignKeyConstraint resultante al método Add de la propiedad Constraints de la tabla, que es una ConstraintCollection. También puede pasar argumentos de constructor a varias sobrecargas del método Add de ConstraintCollection para crear una ForeignKeyConstraint.

Al crear una ForeignKeyConstraint, se pueden pasar los valores DeleteRule y UpdateRule al constructor como argumentos, o se pueden configurar como propiedades, como en el ejemplo siguiente (en que el valor UpdateRule se establece en el valor predeterminado, Cascade).

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)
[C#]
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);

AcceptRejectRule

Los cambios realizados en filas se pueden aceptar con el método AcceptChanges o cancelar con el método RejectChanges de DataSet, DataTable o DataRow. Si un DataSet contiene ForeignKeyConstraints, al invocar los métodos AcceptChanges o RejectChanges se fuerza AcceptRejectRule. La propiedad AcceptRejectRule de ForeignKeyConstraint determina qué acción se tomará en las filas secundarias cuando se llame a AcceptChanges o RejectChanges en la fila primaria.

En la tabla siguiente se enumeran los valores en que se puede establecer AcceptRejectRule.

Acción Descripción
Cascade Acepta o rechaza los cambios en filas secundarias.
None Especifica que no se tome ninguna acción en las filas secundarias. Éste es el valor predeterminado.

UniqueConstraint

El objeto UniqueConstraint, que se puede asignar a una sola columna o a una matriz de columnas de una DataTable, garantiza que todos los datos de las columnas especificadas son únicos en cada fila. Se puede crear una restricción única para una columna o matriz de columnas con el constructor UniqueConstraint. Pase el objeto UniqueConstraint resultante al método Add de la propiedad Constraints de la tabla, que es una ConstraintCollection. También puede pasar argumentos de constructor a varias sobrecargas del método Add de una ConstraintCollection para crear una UniqueConstraint. Al crear una UniqueConstraint para una columna o columnas, se puede especificar opcionalmente si la columna o columnas son una clave principal.

También se puede crear una restricción única para una sola columna estableciendo su propiedad Unique en true. Por otra parte, si se establece la propiedad Unique de una sola columna en false se quita cualquier restricción única que pudiera existir. Si se define una o varias columnas como clave principal de una tabla se creará automáticamente una restricción única para la columna o columnas especificadas. Si quita una columna mediante la propiedad PrimaryKey de una DataTable, se quita la UniqueConstraint.

En el ejemplo siguiente se crea una UniqueConstraint para dos columnas de una DataTable.

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

Vea también

Crear y utilizar DataSets | DataRelation (Clase) | DataTable (Clase) | ForeignKeyConstraint (Clase) | UniqueConstraint (Clase)