Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Apenas uma chave da chave primária composta como chave estrangeira


Esta resposta leva a pergunta "adicionar uma chave estrangeira a table3 " para significar que um FK (chave estrangeira) foi adicionado em table3 referenciando uma das colunas do PK composto (chave primária) de table4 . No SQL padrão, um FK pode fazer referência a um subconjunto próprio/menor de um PK.

Esta outra resposta presumivelmente leva "adicionar uma chave estrangeira para table3 " para significar que um FK foi adicionado em table4 com uma das colunas do PK referenciando table3 . Uma coluna FK definida em uma tabela é independente de quaisquer declarações PK ou UNIQUE nela.

No SQL padrão, um FK pode fazer referência a um subconjunto próprio/menor de um PK.

A lista de colunas referenciada deve ser declarada PRIMARY KEY ou UNIQUE. (PRIMARY KEY cria uma restrição UNIQUE NOT NULL.) (A restrição deve ser explícita, mesmo que qualquer conjunto de colunas NOT NULL contendo um conjunto UNIQUE tenha que ser exclusivo.)

Infelizmente o MySQL permite que você declare um FK referenciando uma lista de colunas que não é ÚNICA. Mesmo que um FK ou uma referência a colunas não NULL (OK no SQL padrão) não seja implementado corretamente, e a própria documentação aconselha a não fazê-lo:

(Você pode refletir sobre o que são e o que não são as operações bem definidas, já que a documentação não esclarece.)

1.8.2.3 Diferenças de chave estrangeira
13.1.18 CREATE TABLE Sintaxe
13.1.18.6 Usando FOREIGN PRINCIPAIS restrições

PS Re relacional vs SQL

No modelo relacional um FK referencia um CK (chave candidata). Uma superchave é um conjunto de colunas exclusivo. Um CK é uma superchave que não contém nenhuma superchave menor. Um CK pode ser chamado de PK (chave primária). Quando os valores de um conjunto de colunas devem aparecer em outro lugar, dizemos que há um IND (dependência de inclusão). Um FK é um IND para um CK. Quando um IND está para uma superchave, podemos chamá-la de "superchave estrangeira".

Um PK SQL ou UNIQUE NOT NULL declara uma superchave. É um CK quando não contém um conjunto de colunas menor declarado como SQL PK ou UNIQUE NOT NULL . SQL FK declara uma superchave estrangeira. Portanto, um SQL PK pode ser um PK relacional (daí CK) e um UNIQUE NOT NULL podem realmente ser um CK. Um SQL FK para um desses na verdade é um FK relacional.