7
respostas

Problema para inserir dados na tabela 'notas'

Não tive problemas com as outras tabelas, mas a tabela notas não aceita os dados pelo seguinte erro:

O erro SQLITE_CONSTRAINT_FOREIGNKEY (código 787) no SQLite ocorre quando uma operação viola uma restrição de chave estrangeira. Isso geralmente acontece ao tentar inserir, atualizar ou deletar registros que quebram a integridade referencial entre tabelas.

Causas Comuns:
Inserção sem pai: Você tenta inserir um registro em uma tabela filha antes de existir o registro correspondente na tabela pai.

Deleção de pai com filhos: Tentar deletar um registro pai que ainda é referenciado por registros filhos, especialmente com ações RESTRICT ou NO ACTION nas chaves estrangeiras.

Ordem incorreta: Em operações em cascata ou múltiplas inserções, a sequência não respeita as dependências.

Já refiz a tabela inumeras vezes, manualmente, importando os dados do arquivo, fiz o drop em todas as tabelas e recomecei varias vezes, copiei a solucao do professor e de alguns colegas aqui do forum.
Conferi os dados das tabelas pai 'alunos' e 'disciplinas' e não há nenhum problema com elas.
Segue a resolução do professor, que ainda dá o erro.
Alguem pode me ajudar por gentileza?

CREATE TABLE Alunos (
ID_Aluno INT PRIMARY KEY,
Nome_Aluno VARCHAR(255),
Data_Nascimento DATE,
Genero VARCHAR(50),
Endereco VARCHAR(255),
Telefone_Contato VARCHAR(20),
Email VARCHAR(255)
);
INSERT INTO 'Alunos' (
'ID_Aluno',
'Nome_Aluno',
'Data_Nascimento',
'Genero','Endereco',
'Telefone_Contato',
'Email'
)
VALUES
('1','João Silva','2005-03-15','Masculino','Rua das Flores, 123','(11) 9876-5432','joao@email.com'),
('2','Maria Santos','2006-06-20','Feminino','Avenida Principal, 456','(11) 8765-4321','maria@email.com'),
('3','Pedro Soares','2004-01-10','Masculino','Rua Central, 789','(11) 7654-3210','pedro@email.com'),
('4','Ana Lima','2005-04-02','Feminino','Rua da Escola, 56','(11) 8765-4321','ana@email.com'),
('5','Mariana Fernandes','2005-08-12','Feminino','Avenida da Paz, 789','(11) 5678-1234','mariana@email.com'),
('6','Lucas Costa','2003-11-25','Masculino','Rua Principal, 456','(11) 1234-5678','lucas@email.com'),
('7','Isabela Santos','2006-09-10','Feminino','Rua da Amizade, 789','(11) 9876-5432','isabela@email.com'),
('8','Gustavo Pereira','2004-05-15','Masculino','Avenida dos Sonhos, 123','(11) 7654-3210','gustavo@email.com'),
('9','Carolina Oliveira','2005-02-20','Feminino','Rua da Alegria, 456','(11) 8765-4321','carolina@email.com'),
('10','Daniel Silva','2003-10-05','Masculino','Avenida Central, 789','(11) 1234-5678','daniel@email.com'),
('11','Larissa Souza','2004-12-08','Feminino','Rua da Felicidade, 123','(11) 9876-5432','larissa@email.com'),
('12','Bruno Costa','2005-07-30','Masculino','Avenida Principal, 456','(11) 7654-3210','bruno@email.com'),
('13','Camila Rodrigues','2006-03-22','Feminino','Rua das Estrelas, 789','(11) 8765-4321','camila@email.com'),
('14','Rafael Fernandes','2004-11-18','Masculino','Avenida dos Sonhos, 123','(11) 1234-5678','rafael@email.com'),
('15','Letícia Oliveira','2005-01-05','Feminino','Rua da Alegria, 456','(11) 9876-5432','leticia@email.com'),
('16','Fernanda Lima','2004-02-12','Feminino','Rua da Esperança, 789','(11) 4567-8901','fernanda@email.com'),
('17','Vinícius Santos','2003-07-28','Masculino','Avenida da Amizade, 123','(11) 8901-2345','vinicius@email.com'),
('18','Juliana Pereira','2006-09-01','Feminino','Rua das Rosas, 789','(11) 3456-7890','juliana@email.com');

CREATE TABLE Disciplinas (
ID_Disciplina INT PRIMARY KEY,
Nome_Disciplina VARCHAR(255),
Descricao TEXT,
Carga_Horaria INT,
ID_Professor INT,
FOREIGN KEY (ID_Professor) REFERENCES Professores(ID_Professor)
);

INSERT INTO 'Disciplinas' (
'ID_Disciplina',
'Nome_Disciplina',
'Descricao',
'Carga_Horaria',
'ID_Professor'
)
VALUES
('1','Matemática','Estudo de conceitos matemáticos avançados','60','1'),
('2','História','História mundial e local','45','2'),
('3','Física','Princípios fundamentais da física','60','1'),
('4','Química','Estudo da química e suas aplicações','45','3'),
('5','Inglês','Aulas de inglês para iniciantes','45','4'),
('6','Artes','Exploração da criatividade artística','30','5');

7 respostas

CREATE TABLE notas (
id_nota INT PRIMARY key,
id_aluno INT,
id_disciplina INT,
valor_nota FLOAT,
data_avaliacao DATE,
FOREIGN key (id_aluno) REFERENCES alunos (id_aluno),
FOREIGN key (id_disciplina) REFERENCES disciplinas (id_disciplina)
);

INSERT INTO notas (
id_nota,
id_aluno,
id_disciplina,
valor_nota,
data_avaliacao
)
VALUES
(2,1,1,6.19,'07/07/2023'),
(3,1,2,7.18,'07/07/2023'),
(4,1,3,7.47,'07/07/2023'),
(5,1,4,7.46,'07/07/2023'),
(6,1,5,4.35,'07/07/2023'),
(7,1,6,4.43,'07/07/2023'),
(8,1,7,0.76,'07/07/2023'),
(9,1,8,9.22,'07/07/2023'),
(10,1,9,9.04,'07/07/2023'),
(11,1,10,3.28,'07/07/2023'),
(12,2,1,1.34,'07/09/2023'),
(13,2,2,3.1,'07/09/2023'),
(14,2,3,1.66,'07/09/2023'),
(15,2,4,0.03,'07/09/2023'),
(16,2,5,4.34,'07/09/2023'),
(17,2,6,4.02,'07/09/2023'),
(18,2,7,8.79,'07/09/2023'),
(19,2,8,1.17,'07/09/2023'),
(20,2,9,8.26,'07/09/2023'),
(21,2,10,3.41,'07/09/2023'),
(22,3,1,6.82,'07/27/2023'),
(23,3,2,8.21,'07/27/2023'),
(24,3,3,1.3,'07/27/2023'),
(25,3,4,4.01,'07/27/2023'),
(26,3,5,0.25,'07/27/2023'),
(27,3,6,6.63,'07/27/2023'),
(28,3,7,9.74,'07/27/2023'),
(29,3,8,3.77,'07/27/2023'),
(30,3,9,0.58,'07/27/2023'),
(31,3,10,8.52,'07/27/2023'),
(32,4,1,8.37,'08/08/2023'),
(33,4,2,0.26,'08/08/2023'),
(34,4,3,5.95,'08/08/2023'),
(35,4,4,6.98,'08/08/2023'),
(36,4,5,6.18,'08/08/2023'),
(37,4,6,4.79,'08/08/2023'),
(38,4,7,7.96,'08/08/2023'),
(39,4,8,0.62,'08/08/2023'),
(40,4,9,7.77,'08/08/2023'),
(41,4,10,5.81,'08/08/2023'),
(42,5,1,2.25,'08/15/2023'),
(43,5,2,5.82,'08/15/2023'),
(44,5,3,4.11,'08/15/2023'),
(45,5,4,7.99,'08/15/2023'),
(46,5,5,3.23,'08/15/2023'),
(47,5,6,8.09,'08/15/2023'),
(48,5,7,8.24,'08/15/2023'),
(49,5,8,3.33,'08/15/2023'),
(50,5,9,4.24,'08/15/2023'),
(51,5,10,0.11,'08/15/2023');

Olá, Rayanna! Como vai?

O problema acontece porque em alguns trechos do código o SQLite tenta acessar uma tabela que ainda não existe, por exemplo aqui:

CREATE TABLE Disciplinas (
ID_Disciplina INT PRIMARY KEY,
Nome_Disciplina VARCHAR(255),
Descricao TEXT,
Carga_Horaria INT,
ID_Professor INT,
FOREIGN KEY (ID_Professor) REFERENCES Professores(ID_Professor)
);

Repare que na última linha da instrução, é necessário que exista a tabela Professores.

Ou seja, o ideal é que você primeiro crie todas as tabelas. E só depois, você use os comandos de inserção.

Eu deixei o código completo e ajustado nesse link, basta copiar e colar:

Espero ter ajudado e fico à disposição se precisar.

Abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado

Oi Daniel,
Eu tinha feito a tabela de professores também. Fiz todas.
Turmas, Turma_aluno, turma_disciplina. Tudo.
De toda forma, copiei seu codigo e deu o mesmo erro.
O codigo da professora e dos colegas que compartilharam no forum também.
Todos dão o erro de foreign key.

Olá, Rayanna!

Seria possível compartilhar um print da sua tela com o erro?

Segue um print da minha tela, acabei de executar o código que te mandei:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Recomendo que você atualize a página, que o SQLite esteja totalmente zerado.

E assim, execute o meu código na íntegra, sem qualquer execução anterior.

Fico no aguardo!

Daniel, acabei de tentar outra vez, com seu codigo. Criei tabela por tabela e inseri os dados por tabela.
O problema aparece quando tento inserir os dados na tabela "Notas".
Eu consigo criar e inserir dados em todas as tabelas, sem erro, menos nessa.

Olá, Rayanna!

Que bom que já conseguiu um progresso!

Algum erro de caractere pode ter ocorrido no momento de copiar e colar o código.

Recomendo que você:
1. Copie todo o código (de maneira completa)
2. Cole todo o código no SQLite
3. Execute tudo de uma vez

Assim não tem risco de perder um caractere durante múltiplas execuções.

Teste isso e me conte se deu certo! Fico no aguardo.

Oi Daniel, obrigada pelo retorno.
Eu fiz isso diversas vezes,
Copia e cola.
Continua a mesma coisa.
desisti.
Estou com o mesmo problema agora em outro exercicio:

SELECT c.nome, p.id
FROM clientes c
FULL JOIN pedidos p
ON c.id = p.idcliente

Trata-se de um modulo do curso Realizando consultas com SQL: Joins, Views e transações - full join.
Esse codigo nao esta devolvendo todas as informacoes das colunas 'nome' da tabela 'clientes' e 'id' da tabela 'pedidos'.
O resultado esperado seria receber todos os clientes que têm ou nao pedidos vinculados a eles, e todos os pedidos que tem ou nao clientes vinculados.
Eu recebo todos os clientes, mas nao recebo as informacoes dos pedidos que nao tem clientes vinculados.
Quando incluo a clausula -- WHERE c.id IS NULL; -- no final do codigo, nao tenho resultado nenhum.
Parece a resposta para um LEFT JOIN.

Fiz algumas pesquisas e segundo o google, o SQLITE nao tem a funcao FULL JOIN como nativa e por isso pode apresentar problemas.
Encontrei uma opcao alternativa que seria a funcao UNION, mas me devolve só uma coluna.
Voce pode me ajudar?