Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Pedro Lima

FK com erro "#1452"

Recommended Posts

Boa noite, estou estudando alguams coisas sobre banco de dados e fui tentar fazer o relacionamento entre duas tabelas criando uma terceira, gostaria que me explicassem o motivo desse erro e se o que eu estou fazendo é realmente o correto...

 

Primeiro vou escrever o comando que tentei rodar:

insert into tb_noticias (titulo, autor, descricao, imagem_grande) values('teste_titulo', 'pedro', 'oiii', 'imagem grande kk')

Retornou este erro:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`portal_de_noticias`.`tb_noticias`, CONSTRAINT `tb_noticias_ibfk_1` FOREIGN KEY (`id`) REFERENCES `lista_imagens` (`id_not`) ON DELETE CASCADE ON UPDATE CASCADE)

Minhasa 3 tabelas estão assim:

            <pma:table name="lista_imagens">
                CREATE TABLE `lista_imagens` (
                  `id_lista_img_not` int(11) NOT NULL AUTO_INCREMENT,
                  `id_not` int(11) NOT NULL,
                  `id_img` int(11) NOT NULL,
                  PRIMARY KEY (`id_lista_img_not`),
                  KEY `id_not` (`id_not`,`id_img`),
                  KEY `id_img` (`id_img`),

                  CONSTRAINT `lista_imagens_ibfk_1` FOREIGN KEY (`id_lista_img_not`) REFERENCES `tb_noticias` (`id_list_img`) ON DELETE CASCADE ON UPDATE CASCADE
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_mysql500_ci;
            </pma:table>

            <pma:table name="tb_imagens_noticias">
                CREATE TABLE `tb_imagens_noticias` (
                  `id_img` int(11) NOT NULL AUTO_INCREMENT,
                  `nome_img` varchar(255) COLLATE utf8_general_mysql500_ci NOT NULL,
                  PRIMARY KEY (`id_img`),

                  CONSTRAINT `tb_imagens_noticias_ibfk_1` FOREIGN KEY (`id_img`) REFERENCES `tb_noticias` (`id_list_img`) ON DELETE CASCADE ON UPDATE CASCADE
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_mysql500_ci;
            </pma:table>


            <pma:table name="tb_noticias">
                CREATE TABLE `tb_noticias` (
                  `id` int(11) NOT NULL AUTO_INCREMENT,
                  `titulo` varchar(255) COLLATE utf8_general_mysql500_ci NOT NULL,
                  `autor` varchar(255) COLLATE utf8_general_mysql500_ci NOT NULL,
                  `descricao` text COLLATE utf8_general_mysql500_ci NOT NULL,
                  `data_criacao` datetime NOT NULL,
                  `data_alteracao` datetime DEFAULT NULL,
                  `imagem_grande` varchar(255) COLLATE utf8_general_mysql500_ci NOT NULL,
                  `id_list_img` int(11) NOT NULL,
                  PRIMARY KEY (`id`),
                  KEY `id_list_img` (`id_list_img`),

                  CONSTRAINT `tb_noticias_ibfk_1` FOREIGN KEY (`id`) REFERENCES `lista_imagens` (`id_not`) ON DELETE CASCADE ON UPDATE CASCADE
                ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_general_mysql500_ci;
            </pma:table>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que a montagem das FK está errada, as tabelas dependentes tem colunas FK que apontam para a PK da tabela principal, aqui parece que ocorre o inverso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado Motta, refiz aqui os relacionamentos mas estou com um problema diferente agora...
Quando rodo esse comando(Que não sei se é a melhor maneira de fazer isso) ele altera todos os campos da fk(id_list_img) na tabela tb_noticias para a id do último registro inserido na tabela lista_imagens.

Código sql:

INSERT INTO tb_noticias(titulo, autor, descricao, imagem_grande) VALUES ('teste','teste','teste','teste');
INSERT INTO lista_imagens (id_not) VALUES(LAST_INSERT_ID());
UPDATE tb_noticias SET id_list_img = LAST_INSERT_ID();

Como concertar isso, ou qual a melhor maneira de fazer esse insert?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cadê os demais campos de lista_imagens !?

Qual a razão do update !?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, na lista_imagens tem 3 campos, a id primária dela, a fk da tb_notícias e fk da tabela tb_imagens.

 

No momento ele está salvando a fk da tb_notícias na lista_imagens normalmente, mas já na tb_notícias não salva a id da lista... por isso usei o update... mas creio que está errado né? Como eu deveria fazer nessa situação? Nunca havia usado fk antes... Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tem muito mistério , primeiro a tabela principal e seguindo as dependentes , o esquemo em php não conheço mas deve ter documentação farta na web.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tem muito mistério , primeiro a tabela principal e seguindo as dependentes , o esquemo em php não conheço mas deve ter documentação farta na web.

Mas por enquanto e puro mysql... Eu nao manjo muito de como fazer esse esquema das chaves estrangeiras...

 

Minha duvida seria:

 

Tenho 3 tabelas

tb_noticia (principal)
tb_imagens
tb_lista_imagens

 

Na tb_noticia, tenho todos os campos vitais da noticia e um campo para a lista de imagens (FK), pois poderei ter varias imagens dentro da mesma noticia.

 

Na tb_noticias vou salvar a id e nome da imagem...

 

Ja na tb_lista_imagens, vou salvar a id da lista, id da noticia e id da imagem...

 

Agora vem a questao do codigo, como eu uso um insert que salve essas informaçoes que eu preciso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Basicamente

Insere tb_noticia, quando a PK gerada.

Enquanto houver imagens e usando a PK salva faça
__insere tb_lista_imagens
__insere tb_imagens 

Sempre fui pouco formal para algoritmos, desculpe.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Na tb_noticias vou salvar a id e nome da imagem...

 

sugiro que repense isso..

pq nome da imagem E id da imagem seriam atributos de "noticia"?

 

ex. classico:

pense no relacionamento funcionários X departamentos..

funcionario pertence a 1 departamento?

então id de departamento pode ser chave estrangeira na tabela de funcionários..

você não vai salvar nomes de funcionarios na tabela departamentos, ok?

então..

pense tb em comentarios à noticia.. por ai vai..

dica: modelagem (projeto) de sistemas e bancos de dados..

sofrem correções, ajustes.. normal.. não tente fazer tudo num "tapa" só..

relacionamento entre chaves.. pense em "pai".. "filho".. (pai é a primária, filhos são as estrangeiras)

 

sugestão:

tabela imagens com seus atributos.. nome, data, id da noticia.. etc..

(como você faria com comentários, redatores...etc..)..

 

estude ahi e boa sorte..

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Basicamente

Insere tb_noticia, quando a PK gerada.

 

Enquanto houver imagens e usando a PK salva faça

__insere tb_lista_imagens

__insere tb_imagens

Sempre fui pouco formal para algoritmos, desculpe.

AEhaue, tranquilo, mas minha dúvida é em relação as fks... como que eu falo para o insert da lista que ele deve receber o id da tb_notícia toda hora? Ou eu simplesmente devo salvar o "LAST_INSERT_ID()" em uma variável e usa-lá para falar que é a id_notícia ?

 

 

 

sugiro que repense isso..

pq nome da imagem E id da imagem seriam atributos de "noticia"?

 

ex. classico:

pense no relacionamento funcionários X departamentos..

funcionario pertence a 1 departamento?

então id de departamento pode ser chave estrangeira na tabela de funcionários..

você não vai salvar nomes de funcionarios na tabela departamentos, ok?

então..

pense tb em comentarios à noticia.. por ai vai..

dica: modelagem (projeto) de sistemas e bancos de dados..

sofrem correções, ajustes.. normal.. não tente fazer tudo num "tapa" só..

relacionamento entre chaves.. pense em "pai".. "filho".. (pai é a primária, filhos são as estrangeiras)

 

sugestão:

tabela imagens com seus atributos.. nome, data, id da noticia.. etc..

(como você faria com comentários, redatores...etc..)..

 

estude ahi e boa sorte..

Então... se eu salvo a id da notícia na tb_imagens, eu posso dispensar a lista_imagens? Realmente simplifica as coisas aehuehauaeh, obrigado pela ideia.

 

 

Obrigado pela ajuda galera.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.