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.