Ir ao conteúdo

Posts recomendados

Postado

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 

 

  • Moderador
Postado

@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', '[email protected]');
INSERT INTO users (name, user, pass, email) VALUES ('Beltrano', 'beltrano99', '1234', '[email protected]');
INSERT INTO users (name, user, pass, email) VALUES ('Ciclano', 'Ciclano198', '1234', '[email protected]');

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.

Postado

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
  • Moderador
Postado

@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.

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...