Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Iccaro Nixon

MySQL Erro 1005 ao criar foreing key

Recommended Posts

Preciso de ajudar, quando eu vou adicionar uma foreign key, aparece um erro:

Can't create table `site`.`#sql-6ee_16` (errno: 150 "Foreign key constraint is incorrectly formed")

 

Comandos:

create table users(id int not null unique auto_increment,
                   name varchar(30) not null, 
                   user varchar(15) not null unique, 
                   pass varchar(15) not null, 
                   email varchar(25) not null, 
                   primary key(id))Engine=InnoDB charset=utf8;
create table post(id int not null unique auto_increment,
                  title varchar(40) not null,
                  post text not null,
                  id_autor int not null)Engine=InnoDB charset=utf8;

Eu queria deixar o id_autor com o foreing key com a coluna id da tabela users.

Comando:

alter table users add foreign key(id) references post(id_autor);

E então aparece esse erro.

Eu acho que é pelo motivo da coluna id da tabela users ter o auto_increment e a do id_autor nao.

Mas o id do users precisa do auto_increment, caso contrario não funciona a aplicação.

E a do id_autor não pode ter o auto_increment porque ele é de acordo com id da tabela users.

 

o que eu faço? HELP 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Iccaro Nixon  O colega acima está correto. 

 

Você inverteu a ordem.

Como havia explicado em seu outro post. Você precisa entender qual a tabela que é a mandante da consulta. 

Você colocou como user. Onde deveria ser post.

 

Então seu erro, é que você está atribuindo ao contrário, onde  você diz que o campo ID de users é uma chave estrangeira.

 

Faça da seguinte forma:

create table users(id int not null unique auto_increment,
                   name varchar(30) not null, 
                   user varchar(15) not null unique, 
                   pass varchar(15) not null, 
                   email varchar(25) not null, 
                   primary key(id))Engine=InnoDB charset=utf8;
                   
create table post(id int not null unique auto_increment,
                  title varchar(40) not null,
                  post text not null,
                  id_autor int not null)Engine=InnoDB charset=utf8;    

alter table post add foreign key(id_autor) references users(id);

INSERT INTO users (name, user, pass, email) VALUES ('Fulano', 'Fulaninho23', '1234', 'fulano@fulano.com');
INSERT INTO users (name, user, pass, email) VALUES ('Beltrano', 'beltrano99', '1234', 'Beltrano@Beltrano.com');
INSERT INTO users (name, user, pass, email) VALUES ('Ciclano', 'Ciclano198', '1234', 'ciclano@Ciclano.com');

INSERT INTO post (title, post, id_autor) VALUES ('Noticia 1', 'Aqui é a noticia 1', 1);
INSERT INTO post (title, post, id_autor) VALUES ('Noticia 2', 'Aqui é a noticia 2', 1);
INSERT INTO post (title, post, id_autor) VALUES ('Noticia 3', 'Aqui é a noticia 3', 1);
INSERT INTO post (title, post, id_autor) VALUES ('Noticia 4', 'Aqui é a noticia 4', 2);
INSERT INTO post (title, post, id_autor) VALUES ('Noticia 5', 'Aqui é a noticia 5', 3);
INSERT INTO post (title, post, id_autor) VALUES ('Noticia 6', 'Aqui é a noticia 6', 3);

 

Repare na linha do alter table.

Eu alterei a tabela post e não a user. 

Porque estamos dizendo que é a tabela post que irá controlar o relacionamento de 1:N ( um para muitos, onde um autor, pode ter um ou mais posts.

 

A consulta para a estrutura acima fica:

 

Select users.name, 
       post.title, 
       post.post 
FROM post
INNER JOIN users ON users.id = post.id_autor

Isto irá retornar todos  os nomes de quem postou, os títulos e o posts.

 

Veja também este exemplo online baseado no seu código(acima):  http://sqlfiddle.com/#!9/6588664/6/0

 

PS: Não sei até quando ficará no ar este exemplo. O site costuma apagar depois de um tempo.  Mas faça a experiência.

Ali do lado direito é o campo de consulta.

Coloque o WHERE id_autor = 1  e veja o que acontece.  Depois faça o mesmo com o id_autor = 2   e id_autor = 3.

 

adicionado 5 minutos depois

Contudo, eu diria que é mais fácil de entender isso, se você o fizer visualmente pelo phpmyadmin  na aba da estrutura( para criar o índice)  e na aba desenhador(Designer)  para criar de fato o relacionamento.

 

Se quiser entender melhor essa parte recomendo que veja  este vídeo que gravei a alguns anos.

Parte 1

 

 

Parte 2

 

 

 

PS: A versão do phpmyadmin ali está um pouco antiga mas o processo é o mesmo, e os lugares são os mesmos.

 

PS2: Não sei porque o youtube deixou a música curta. então desde agora desculpe se você achar maçante demais o video, pois na época eu não tinha headset para falar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

De inicio nao deu certo, nao achei erro, resolvi recriar todas as tabelas e colocar a foreign key dnv e deu certo :D

Obrigado guys, adorei o fórum.

Desculpa pelas burradas, ainda estou aprendendo, e o fórum está dando um boost muito bom.

Obrigado de verdade <3

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Iccaro Nixon Como disse anteriormente, seu erro era porque estava definindo errado a chave estrangeira.

 

Errado:

alter table users add foreign key(id) references post(id_autor);

Certo:

alter table post add foreign key(id_autor) references users(id);

 

Porque é na tabela post que está a chave estrangeira e não na tabela user.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×