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.
Existe en otra tabla ... o en la misma tabla. –
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