Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Duvida com Foreign Key


felipebath

Pergunta

Boa tarde!

Fiz tudo certo?

Preciso definir alguma coisa com Index no phpmyadmin?

O que é Index?

o codigo:

create table disciplina
(    id_disciplina        int        not null AUTO_INCREMENT,
    nome                char(50)    not null,
    primary key (id_disciplina)
)
TYPE=InnoDB;



create table aluno
(    id_aluno        int                     not null AUTO_INCREMENT,
        matricula    int             not null,
    nome         char(80)        not null,
    primary key (id_aluno)
)
TYPE=InnoDB;



create table turma
(    
        id_turma         int         not null AUTO_INCREMENT,
        matricula               int             not null,
        id_disciplina       int             not null,
        foreign key (id_disciplina) references disciplina (id_disciplina)
        foreign key (matricula) references aluno (matricula)
)
TYPE=InnoDB;


create table boletim
(    

        matricula               int            not null,
        id_materia              int            not null,
        id_turma                int            not null, 
        v1              decimal(6,2)            null,
        vt              decimal(6,2)            null,
        v2              decimal(6,2)            null,
        ms              decimal(6,2)            null,
        vs              decimal(6,2)            null,
        mf              decimal(6,2)            null,
        faltas            int                     not null,
        situacao        char(30)                not null,
        
        foreign key (matricula) references turma (matricula)
                on delete cascade,
        foreign key (id_disciplina) references disciplina (id_disciplina)
        on delete cascade,
    foreign key (id_turma) references turma (id_turma)
                on delete cascade
)
TYPE=InnoDB;

Grato.

Link para o comentário
Compartilhar em outros sites

15 respostass a esta questão

Posts Recomendados

  • 0

Oi, 'felipebath'

Como você está usando TYPE na declaração do engine InnoDB, presumo que a versão do seu MySQL é inferior a 5.x. Consequentemente, não vai funcionar a constraint de foreign key que só foi implementada após a versão 5.

Quanto a sua pergunda sobre

O que é Index?
É um índice. uma forma rápida de ordenar e achar o que se quer por uma chave (um po mais campos separados por vírgula)

Como já falei antes em outro post hoje, não use AUTO_INCREMENT com int. Use int unsigned, pois o AUTO_INCREMENT é para número inteiro positivo e você não precisará do byte de sinal.

Link para o comentário
Compartilhar em outros sites

  • 0
Oi, 'felipebath'

Como você está usando TYPE na declaração do engine InnoDB, presumo que a versão do seu MySQL é inferior a 5.x. Consequentemente, não vai funcionar a constraint de foreign key que só foi implementada após a versão 5.

Quanto a sua pergunda sobre

O que é Index?
É um índice. uma forma rápida de ordenar e achar o que se quer por uma chave (um po mais campos separados por vírgula)

Como já falei antes em outro post hoje, não use AUTO_INCREMENT com int. Use int unsigned, pois o AUTO_INCREMENT é para número inteiro positivo e você não precisará do byte de sinal.

Oi Denis,

Versão do cliente MySQL é: 5.0.45

Como se declara InnoDB nas versoes mais recentes do MySQL?

Index estao associados a FK's?

vou alterar o auto_increment...

vou re-criar o banco para testar os campos e tabelas...

grato.

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'felipebath'

Como se declara InnoDB nas versoes mais recentes do MySQL?
ENGINE=InnoDB

Index estao associados a FK's?

Sim. FKs são indices.

Para a criação de Fks use:

CONSTRAINT <nome-do-indice> FOREIGN KEY (<campo-desta-tabela>) REFERENCES <tabela-alvo> (<campo-da-tabela-alvo>);

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'felipebath'

Esqueci um ponto.

Troque DECIMAL por DOUBLE. O primeiro está ultrapassado e dá erro, algumas vezes (para a versão que você usa).

A não ser que haja necessidade extrema, troque de CHAR para VARCHAR nas strings grandes para nome e situacao.

Link para o comentário
Compartilhar em outros sites

  • 0

Depois de editar com as ultimas recomendacoes...

*******************

Continua dando erro de sintaxe na linha 6 na criacao da tabela turma:

create table disciplina
(    id_disciplina        int        unsigned  not null,
    nome                varchar(50)    not null,
    primary key (id_disciplina)
)
ENGINE=InnoDB;



create table aluno
(    id_aluno        int                     unsigned not null,
        matricula    int             not null,
    nome         varchar(80)        not null,
    primary key (id_aluno)
)
ENGINE=InnoDB;



create table turma
(    
        id_turma         int         unsigned not null,
        matricula               int             not null,
        id_disciplina       int             not null,
        CONSTRAINT id_disciplina FOREIGN KEY (id_disciplina) REFERENCES disciplina (id_disciplina);
        CONSTRAINT matricula FOREIGN KEY (matricula) REFERENCES aluno (matricula);
)
ENGINE=InnoDB;


create table boletim
(    

        matricula               int            not null,
        id_disciplina           int            not null,
        id_turma                int            not null, 
        v1              double(6,2)            null,
        vt              double(6,2)            null,
        v2              double(6,2)            null,
        ms              double(6,2)            null,
        vs              double(6,2)            null,
        mf              double(6,2)            null,
        faltas            int                     not null,
        situacao        varchar(30)                not null,
        
        CONSTRAINT matricula FOREIGN KEY (matricula) REFERENCES turma (matricula) on delete cascade;
        CONSTRAINT id_disciplina FOREIGN KEY (id_disciplina) REFERENCES disciplina (id_disciplina) on delete cascade;
        CONSTRAINT id_turma FOREIGN KEY (id_turma) REFERENCES turma (id_turma) on delete cascade;


)
ENGINE=InnoDB;

não consigo localizar...

Grato.

Editado por felipebath
Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'felipebath',

Verifique o índice primário em aluno (primary key (id_aluno))

E veja o que você está fazendo em turma CONSTRAINT matricula FOREIGN KEY (matricula) REFERENCES aluno (matricula);

Não vai funcionar nunca.

A pergunta que não quer calar. Para que serve id_aluno se a referência básica é matrícula?

Link para o comentário
Compartilhar em outros sites

  • 0

Ow, sim... você tem toda a razão, Denis.

Devo definir como PK o campo matricula e não o id_aluno na tabela aluno...

alias, acho que posso deletar o campo id_aluno...

create table disciplina
(    id_disciplina                       int        unsigned  not null,
    nome                varchar(50)    not null,
    primary key (id_disciplina)
)
ENGINE=InnoDB;

create table aluno
(    
                matricula                    int         not null,
    nome         varchar(80)    not null,
    primary key (matricula)
)
ENGINE=InnoDB;

create table turma
(    
        id_turma         int     unsigned not null,
        matricula                           int             not null,
        id_disciplina                       int             not null,
        CONSTRAINT id_disciplina FOREIGN KEY (id_disciplina) REFERENCES disciplina (id_disciplina);
        CONSTRAINT matricula FOREIGN KEY (matricula) REFERENCES aluno (matricula);
)
ENGINE=InnoDB;
agora deu erro de sintaxe na linha:
CONSTRAINT id_disciplina FOREIGN KEY (id_disciplina) REFERENCES disciplina (id_disciplina);

continuo fazendo algo errado?

preciso definir o campo como PK na tabela-destino? Por exemplo: id_disciplina na tabela turma

Grato.

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'felipebath'

observe o código CONSTRAINT id_disciplina FOREIGN

O nome do índice id_disciplina está conflitando com o nome do campo id_disciplina.

O nome do índice deve ser único em todo o banco e o nome do campo deve ser único na tabela.

Como dica para criação de nome de índice, use o nome da duas letras para identificar o tipo do índicie, seguido do nome da tabela, seguido de um sequencial numérico.

Exemplo:

create table turma
(    
   id_turma        int     unsigned not null,
   matricula        int             not null,
   id_disciplina    int             not null,
   CONSTRAINT FK_turma_001 FOREIGN KEY (id_disciplina) REFERENCES disciplina (id_disciplina),
   CONSTRAINT FK_turma_002 FOREIGN KEY (matricula) REFERENCES aluno (matricula),
   PRIMARY KEY (id_turma)
)
ENGINE=InnoDB;

Link para o comentário
Compartilhar em outros sites

  • 0

'felipebath'

Outra dica:

Coloque nomes claros, que representem de forma óbvia o que você espera do campo.

Exemplo:

você usou

create table boletim
(    

        matricula               int            not null,
        id_disciplina           int            not null,
        id_turma                int            not null, 
        v1              double(6,2)            null,
        vt              double(6,2)            null,
        v2              double(6,2)            null,
        ms              double(6,2)            null,
        vs              double(6,2)            null,
        mf              double(6,2)            null,
...

Use nomes como AVALIACAO_1, etc.

Evite colocar campos calculados, tais como MEDIA, MEDIA_FINAL, etc.

Estes campos podem ser calculados facilmente em qualquer consulta SQL e não tem a necessidade de estarem permanentemente no banco de dados.

Link para o comentário
Compartilhar em outros sites

  • 0

Erro
consulta SQL: 

CREATE TABLE turma(

id_turma int unsigned NOT NULL ,
matricula int NOT NULL ,
id_disciplina int NOT NULL ,
CONSTRAINT fk_disc_01 FOREIGN KEY ( id_disciplina ) REFERENCES disciplina( id_disciplina );

Mensagens do MySQL :  

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 6
Denis, você é muito didático... esta clareando agora o que é index...
"O nome do índice deve ser único em todo o banco e o nome do campo deve ser único na tabela."

não sei onde esta o erro...

av1 é a definicao mesmo... no form tb fica av1, sakou?

vlw.

Link para o comentário
Compartilhar em outros sites

  • 0

'felipebath' ,

Coloque somente um ponto e virgula por instrução SQL.

Detectei vários ponto e virgulas em suas instruções SQL.

CONSTRAINT fk_disc_01 FOREIGN KEY ( id_disciplina ) REFERENCES disciplina( id_disciplina );

O ponto e virgula deveria estar somente ao final da instrução CREATE.

Substitua por virgulas se existirem instruções após a linha com erro ou não deixe nada se não houver mais instruções.

Link para o comentário
Compartilhar em outros sites

  • 0

create table turma
(    
        id_turma         int    unsigned not null,
        matricula                           int             not null,
        id_disciplina                       int             not null,
        CONSTRAINT fk_disc_01 FOREIGN KEY (id_disciplina) REFERENCES disciplina (id_disciplina),
        CONSTRAINT fk_mat_01 FOREIGN KEY (matricula) REFERENCES aluno (matricula),
        PRIMARY KEY (id_turma)
)
ENGINE=InnoDB;
O erro foi diferente depois das substituicoes de ; #1005 - Can't create table './dominio/turma.frm' (errno: 150) na documentacao encontrei:
"Se o MySQL retornar o erro de número 1005 de uma instrução CREATE TABLE, e a string de mensagem de erro se referir ao errno 150, então a criação da tabela falhou porque um restrição de chaves estrangeiras não foi formada corretamente."

O que estou fazendo de errado agora? :blink:

Link para o comentário
Compartilhar em outros sites

  • 0

'felipebath'

Verifique se em uma tabela você declarou o campo como int unsigned e em outra tabela você declarou o mesmo campo como int apenas.

Eu já tinha visto o erro.

Preste sempre muita atenção quando for ligar duas tabelas. os campos em ambas as tabelas devem ser exatamente iguais no tipo e no tamanho, não no nome.

Por padrão, salvo em raras exceções, eu sempre declaro tudo igual. até o nome.

Link para o comentário
Compartilhar em outros sites

  • 0

create table disciplina
(    id_disciplina        int        unsigned  not null,
    nome                varchar(50)    not null,
    primary key (id_disciplina)
)
ENGINE=InnoDB;


create table aluno
(    
        matricula    int             not null,
    nome         varchar(80)        not null,
    primary key (matricula)
)
ENGINE=InnoDB;


create table turma
(    
        id_turma         int         unsigned not null,
        matricula               int             not null,
        id_disciplina       int             unsigned not null,
        CONSTRAINT fk_disc_01 FOREIGN KEY (id_disciplina) REFERENCES disciplina (id_disciplina),
        CONSTRAINT fk_mat_01 FOREIGN KEY (matricula) REFERENCES aluno (matricula),
        PRIMARY KEY (id_turma)
)
ENGINE=InnoDB;


create table boletim
(    

        matricula               int            not null,
        id_disciplina           int   unsigned not null,
        id_turma                int   unsigned not null, 
        v1              double(6,2)            null,
        vt              double(6,2)            null,
        v2              double(6,2)            null,
        ms              double(6,2)            null,
        vs              double(6,2)            null,
        mf              double(6,2)            null,
        faltas            int                     not null,
        situacao        varchar(30)                not null,
        
        CONSTRAINT fk_mat_02 FOREIGN KEY (matricula) REFERENCES turma (matricula) on delete cascade,
        CONSTRAINT fk_disc_02 FOREIGN KEY (id_disciplina) REFERENCES disciplina (id_disciplina) on delete cascade,
        CONSTRAINT fk_turma_01 FOREIGN KEY (id_turma) REFERENCES turma (id_turma) on delete cascade,
        PRIMARY KEY (matricula)
)
ENGINE=InnoDB;

As tabelas foram criadas com sucesso...

agora, Denis, poderia abusar mais um pouco de sua boa vontade e paciencia com este iniciante?

Fui tentar inserir um aluno...

a matricula deste aluno vai automaticamente para alguma outra tabela atraves da FK matricula?

Como isto funciona?

Grato.

Link para o comentário
Compartilhar em outros sites

  • 0
...

As tabelas foram criadas com sucesso...

agora, Denis, poderia abusar mais um pouco de sua boa vontade e paciencia com este iniciante?

Fui tentar inserir um aluno...

a matricula deste aluno vai automaticamente para alguma outra tabela atraves da FK matricula?

Como isto funciona?

Grato.

Oi Felipe,

As inserções são independentes. dependendo do modelo de dados que você criou você pode inserir automaticamente uma matricula em uma outra tabela usando trigger. Mas isto já é outro tópico.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...