sql >> Base de Datos >  >> RDS >> Mysql

Solo una clave de la clave primaria compuesta como clave externa

Esta respuesta toma la pregunta "agregar una clave externa a table3 " para indicar que se agregó una FK (clave externa) en table3 haciendo referencia a una de las columnas de la PK compuesta (clave principal) de table4 . En SQL estándar, un FK puede hacer referencia a un subconjunto adecuado/más pequeño de un PK.

Esta otra respuesta presumiblemente toma "agregar una clave externa a table3 " para indicar que se agregó un FK en table4 con una de las columnas del PK que hace referencia a table3 . Una columna FK configurada en una tabla es independiente de cualquier declaración PK o UNIQUE que contenga.

En SQL estándar, un FK puede hacer referencia a un subconjunto adecuado/más pequeño de un PK.

La lista de columnas a la que se hace referencia debe declararse PRIMARY KEY o UNIQUE. (PRIMARY KEY crea una restricción UNIQUE NOT NULL). (La restricción debe ser explícita, aunque cualquier conjunto de columnas NOT NULL que contenga un conjunto que sea ÚNICO debe ser único).

Desafortunadamente, MySQL le permite declarar un FK que hace referencia a una lista de columnas que no es ÚNICA. Aunque tal FK o uno que hace referencia a columnas que no son NULL (OK en SQL estándar) no se implementa correctamente, y la propia documentación aconseja no hacerlo:

(Puede reflexionar sobre cuáles son y cuáles no son las operaciones bien definidas, ya que la documentación en realidad no aclara).

1.8.2.3 Diferencias de clave externa
13.1.18 CREAR TABLA Sintaxis
13.1.18.6 Uso de FOREIGN Restricciones CLAVE

PS Re relacional frente a SQL

En el modelo relacional, un FK hace referencia a un CK (clave candidata). Una superclave es un conjunto de columnas único. Una CK es una superclave que no contiene una superclave más pequeña. Una CK puede llamarse PK (clave principal). Cuando los valores de un conjunto de columnas deben aparecer en otro lugar, decimos que hay una IND (dependencia de inclusión). Un FK es un IND para un CK. Cuando un IND es para una superclave, podríamos llamarlo una "superclave extranjera".

Un PK de SQL o UNIQUE NOT NULL declara una superclave. Es un CK cuando no contiene un conjunto de columnas más pequeño declarado como SQL PK o UNIQUE NOT NULL . SQL FK declara una superclave ajena. Entonces, un SQL PK en realidad podría ser un PK relacional (por lo tanto, CK) y un ÚNICO NO NULO podría en realidad ser una CK. Un SQL FK para uno de estos en realidad es un FK relacional.