Foreign key dando problema

Estou criando 2 tabelas e relacionando-as usando o Foreign key mas esta acontecendo uma coisa que não entendo (a relação aqui é de n para 1) código abaixo:

-- criação da tabela alunos
create table alunos (
idaluno int auto_increment,
nome varchar(30),
idade int,
data_nasc date,
primary key (idaluno)
) default charset = utf8;

-- criação da tabela aulas

create table aulas (
numaula int auto_increment,
nome varchar(20),
duracao int,
primary key (numaula)
) default charset = utf8;

-- cadastro dos alunos

insert into alunos values
(idaluno, 'Miguel', '18', '2001-04-14'),
(idaluno, 'Isadora', '18', '2001-05-02'),
(idaluno, 'Gabriela', '20', '1999-04-13'),
(idaluno, 'Ayslan', '18', '2001-11-18'),
(idaluno, 'Ryan', '18', '2001-09-23'),
(idaluno, 'Igor', '18', '2001-04-29');

-- cadastro das aulas

insert into aulas values
(numaula, 'Fisica', '50'),
(numaula, 'Matemática', '120'),
(numaula, 'Geográfia', '20'),
(numaula, 'Quimica', '40'),
(numaula, 'Sociologia', '10'),
(numaula, 'E.D Fisica', '40'),
(numaula, 'História', '60'),
(numaula, 'Português', '60');
-- ------------------------------------------------------------------------------------------

-- inserir chave estrangeira
alter table alunos 
modify alid int after idaluno;

alter table alunos
add foreign key (alid)
references aulas(numaula);

-- integrar as tabelas com a chave estrangeira

update alunos set alid = '2' where idaluno = '1';


delete from aulas where numaula = '2'; 

-> O que não entendo é que quando dou esse delete, ele deleta o registro, porém pelo que vi não era pra isso acontecer quando uso a chave estrangeira. Pelo que vi era pra isso dar um erro pois ja a uma ligação entre esse registro e o registro da tabela alunos. Bom estou usando o WorkBench e não sei por que ele está excluindo o registro, quando na verdade era pra dar um erro. Se alguém souber por favor me diga, obrigado.

No Workbench tem uma opção chamada “Set Update” (se não me engano) que atua sobre as atualizações (Update) e exclusões (Delete). Creio que esteja em Edit > Preferentes.

1 curtida

não consegui achar… acho que não está la, mas la tem as engines do MySQL, ta na innoDB, vou tentar mudar pra ExtraDB e testar. vlw

No entanto, fiz alguns testes… Aqui o DB não aceitou que eu definisse a coluna alid como chave estrangeira enquanto ela não tivesse valores válidos (maior que zero), ou seja, apontava falha em criar a restrição (constraint). Você inspecionou a tabela para ver se o campo alid realmente se tornou uma FK? No Workbench tem a opção Inspect e depois é só verificar se a informação Indexes registra a coluna alid. Se não, então alid não está registrada na tabela como uma FK. Por comando, tu pode fazer:

DESCRIBE Alunos;

Se a coluna alid aparecer como MUL, então ela está registrada na tabela como FK.

image

Nesse caso, o BD vai negar a operação de deleção:

Fiz algumas modificações para que eu pudesse testar…

CREATE DATABASE Escola;
USE Escola;

CREATE TABLE IF NOT EXISTS Alunos(
	id_aluno INT NOT NULL AUTO_INCREMENT,
	nome_aluno VARCHAR(30) NOT NULL,
	idade SMALLINT NOT NULL,
	data_nascimento DATE NOT NULL,
	CONSTRAINT pk_aluno PRIMARY KEY(id_aluno)
);

CREATE TABLE IF NOT EXISTS Aulas(
	num_aula INT NOT NULL AUTO_INCREMENT,
	nome_aula VARCHAR(20) NOT NULL,
	duracao SMALLINT NOT NULL,
	CONSTRAINT pk_aula PRIMARY KEY(num_aula)
);

INSERT INTO Alunos VALUES
(id_aluno, 'Miguel', '18', '2001-04-14'),
(id_aluno,'Isadora', '18', '2001-05-02'),
(id_aluno,'Gabriela', '20', '1999-04-13'),
(id_aluno,'Ayslan', '18', '2001-11-18'),
(id_aluno,'Ryan', '18', '2001-09-23'),
(id_aluno,'Igor', '18', '2001-04-29');

INSERT INTO Aulas VALUES
(num_aula, 'Física', 50),
(num_aula, 'Matemática', 120),
(num_aula, 'Geografia', 20),
(num_aula, 'Química', 40),
(num_aula, 'Sociologia', 10),
(num_aula, 'E.D. Física', 40),
(num_aula, 'História', 60),
(num_aula, 'Português', 60);

ALTER TABLE Alunos ADD COLUMN alid INT NOT NULL AFTER id_aluno;

UPDATE Alunos SET alid = 2 WHERE id_aluno = 1;
UPDATE Alunos SET alid = 8 WHERE id_aluno = 2;
UPDATE Alunos SET alid = 5 WHERE id_aluno = 3;
UPDATE Alunos SET alid = 1 WHERE id_aluno = 4;
UPDATE Alunos SET alid = 3 WHERE id_aluno = 5;
UPDATE Alunos SET alid = 4 WHERE id_aluno = 6;

ALTER TABLE Alunos
ADD CONSTRAINT fk_aluno_aula
FOREIGN KEY(alid) REFERENCES Aulas(num_aula);

DELETE FROM Aulas WHERE num_aula = 2;

ERRO 1451:

O InnoDB relata esse erro quando você tenta excluir uma linha pai que tem filhos, e uma restrição de chave estrangeira falha. Exclua os filhos primeiro.

Sim, a minha apareceu MUL mas mesmo assim não ta dando o erro. Depois fui da uma pesquisada e rodei um comando (não lembro agora foi mal) que mostrava as tabelas e quais engines estavam em cada uma, e na aulas e alunos estava a MyISAM justamente a que não suporta esse tipo de operação. Ai usei outro comando (que tambem não lembro kk) pra mudar a engines dessas duas tabelas pra innoDB. depois que eu mudei, dei um delete em duas tuplas que estavam conectadas entre as duas tabelas, mas ele continua excluindo e não da o erro… mas acho que é por que ja tinha mexido nessas tabelas usando a engine MyISAM e ainda excluido muitos dados que estavam integrados quando estava na MyISAM ai quando troquei pra innoDB o mysql não deve ter dado diferença. Amanhã vou tentar criar outro DB com duas novas tabelas e mudar a engine das duas no começo pra innoDB, e testar o delete em alguns registros pra ver no que da. Alias obrigado pela ajuda, seu código está bem melhor que o meu kkkk, mas vlw mesmo.