Ir ao conteúdo
  • Cadastre-se
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

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





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

×