2010-04-11 14 views
8

Estoy bastante confundido acerca de la diferencia entre una restricción FOREIGN KEY y CHECK - me parecen para lograr el mismo resultado.¿Cuál es la diferencia entre cheque y clave externa?

Quiero decir que podría crear una tabla y aplicar una clave externa en otra tabla, pero podría crear un CHECK para asegurar el valor en otra tabla.

¿Cuál es la diferencia y cuándo usar uno u otro?

Respuesta

6

Una restricción FOREIGN KEY asegura que la entrada HACE existe en

EDITAR otra mesa

según correcta comentario existe en otra mesa ... o la misma mesa. - Mark Byers

Una restricción CHECK asegura que la entrada sigue alguna regla.

CHECK Constraints

restricciones CHECK imponer la integridad de dominio mediante la limitación de los valores que son aceptados por una columna. Son similares a las restricciones FOREIGN KEY en que controlan los valores que se ponen en una columna. La diferencia está en cómo determinan qué valores son válidos: las restricciones FOREIGN KEY obtienen la lista de valores válidos de otra tabla, y las restricciones CHECK determinan los valores válidos de una expresión lógica que no se basa en datos de otra columna.

+4

Existe en otra tabla ... o en la misma tabla. –

+0

Las restricciones CHECK determinan que ... no se basa en datos de otra columna. No del todo correcto, las restricciones de verificación pueden incluir varias columnas (al menos en 10 g). Mejor es decir "no basado en datos en otra tabla". – Juraj

2

Una restricción de clave foránea es más poderosa que una restricción CHECK.
Una restricción de clave foránea significa que la columna (en la tabla actual) solo puede tener valores que ya existen en la columna de la tabla foránea (que puede incluir ser la misma tabla, a menudo hecha para datos jerárquicos). Esto significa que a medida que la lista de valores cambia, se vuelve más grande o más pequeña, no hay necesidad de actualizar la restricción.

Una restricción de comprobación no puede hacer referencia a ninguna columna fuera de la tabla actual y no puede contener una subconsulta. A menudo, los valores están codificados como BETWEEN 100 and 999 o IN (1, 2, 3). Esto significa que a medida que cambian las cosas, deberá actualizar la restricción CHECK cada vez. Además, una relación de clave externa es visible en un Diagrama de relación de entidad (ERD), mientras que una restricción CHECK nunca será. El beneficio es que alguien puede leer el ERD y construir una consulta desde él sin utilizar numerosos comandos de la tabla DESC para saber qué columnas están en el lugar y qué se relaciona con qué construir las uniones apropiadas.

La mejor práctica es utilizar primero claves externas (y tablas de soporte). Utilice restricciones CHECK como una copia de seguridad para situaciones en las que no puede usar una clave externa, no como la solución principal para validar datos.

+2

Las claves externas no tienen que ser claves de una sola columna. –

1

Depende de su DBMS (que no especificó), pero en cierto sentido, está en lo cierto: una restricción de clave externa es un caso particular de una restricción de verificación. Hay DBMS que no le permitiría formular una restricción de clave externa como una restricción de verificación.

La intención principal de una restricción de verificación es describir las condiciones que se aplican a una sola fila en la tabla. Por ejemplo, tengo una tabla de elementos (como en Hidrógeno, Helio, ...) y los símbolos para los elementos están obligados a comenzar con una letra mayúscula y son seguidos por cero, una o dos letras minúsculas (dos letras minúsculas para elementos aún por descubrir pero predichos: Uus - ununseptium (117) , que acaba de ser aislado pero aún no se ha nombrado). Esto puede ser objeto de una restricción CHECK:

CHECK(Symbol MATCHES "[A-Z][a-z]{0,2}") 

MATCHES suponiendo existe y apoya un lenguaje de expresiones regulares apropiado.

Usted también puede tener restricciones de comprobación que comparan valores:

CHECK(OrderDate <= ShipDate OR ShipDate IS NULL) 

Expresar una restricción de clave externa como una restricción de comprobación, que tiene que ser permitido para ejecutar una consulta en la cláusula CHECK. Hipotéticamente:

CHECK(EXISTS(SELECT * FROM SomeTable AS s 
       WHERE ThisTable.pk_col1 = s.pk_col1 AND 
        ThisTable.pk_col2 = s.pk_col2)) 

Este ejemplo muestra algunos de los problemas. No tengo un alias de tabla conveniente para la tabla en la que estoy escribiendo la restricción de verificación: supuse que era 'ThisTable'. El constructo es detallado. Suponiendo que la clave principal en alguna_tabla se declara en columnas pk_col1 y pk_col2, entonces la cláusula FOREIGN KEY es mucho más compacto:

FOREIGN KEY (pk_col1, pk_col2) REFERENCES SomeTable 

O, si se hace referencia a una clave alternativa, no la clave principal:

FOREIGN KEY (pk_col1, pk_col2) REFERENCES SomeTable(ak_col1, ak_col2) 

Esto es notablemente más compacto, por lo que hay menos posibilidades de equivocarse, y el servidor puede solucionarlo porque la notación especial significa que sabe que se trata de una restricción de clave externa mientras que la cláusula de verificación general tiene que ser examinado para ver si coincide con una de las muchas formas posibles que una re equivalente a la clave externa.

La pregunta es: cuándo usar una restricción de comprobación y cuándo usar una restricción de clave externa?

  • Use una restricción CHECK para especificar los criterios que se pueden verificar en una sola fila.
  • Use una restricción FOREIGN KEY para especificar que los valores en la fila actual deben coincidir con los valores de una fila en otra clave única (una clave candidata, generalmente la clave principal en lugar de una clave alternativa) de alguna tabla, que puede ser la misma tabla o (más habitualmente) una tabla diferente.
Cuestiones relacionadas