Problema ao criar chave estrangeira

Estou tentando criar algumas tabelas utilizando os comandos:

CREATE TABLE cursos (
	id_curso int auto_increment primary key,
    nome varchar(255) not null,
    duracao int
);

CREATE TABLE matriculas (
	id_matricula int auto_increment primary key,
    data_entrada datetime,
	foreign key (id_curso) references curso (id_curso)
);

A criação da tabela cursos é feita sem problemas, mas a de matriculas dá o seguinte erro:
Error Code: 1072. Key column 'id_curso' doesn't exist in table

Não entendo exatamente o porque do erro, até porque a coluna id_curso é criada sem problemas algum. Alguma luz?

A coluna precisa existir na sua tabela para que você possa criar uma relação de FK.

CREATE TABLE matriculas (
	id_matricula int auto_increment primary key,
    data_entrada datetime,
    id_curso int not null,
	foreign key (id_curso) references curso (id_curso)
);
3 curtidas

Agora eu que tenho uma dúvida: Então no caso serão 3 colunas do mesmo jeito?

Tipo, apesar de ter a notação de fk ele não é uma coluna específica, correto?

Incorreto! a tabela possuí as 3 colunas normalmente, a única diferença é que, quando é criada a relação de FK, eu não consigo informar valores inexistentes para a coluna id_curso, pois isso obriga que exista um registro na tabela curso com o valor que está sendo referenciado!
Da mesma forma eu não consigo remover um registro da tabela cursos, cujo o mesmo esteja sendo referenciado na tabela matriculas!
Isso me garante a integridade e consistência da informação.
Caso contrário eu conseguiria criar informações inconsistentes.

eu entendi o que você falou mas é exatamente o que eu pensava…

temos o campo id_matricula, data_entrada e id_curso, três colunas, e não quatro :man_shrugging:

Eu havia interpretado incorretamente o que você havia falado, mas agora relendo eu compreendi o que você quis dizer!

Sim, é exatamente isso, a notação de FK utiliza alguma coluna já declarada anteriormente na tabela para criar a relação, ela não gera uma coluna.

1 curtida

Muito obrigado pela resposta, Jonathan! Marquei como solução já. :slight_smile:

1 curtida