Pergunta

Eu sou a criação de um banco de dados usando o phpMyAdmin. Eu tenho duas tabelas (foo e bar), indexados em suas chaves primárias . Eu estou tentando criar uma tabela relacional (foo_bar) entre eles, usando suas chaves primárias como chaves estrangeiras.

Eu criei essas tabelas como MyISAM, mas mudaram desde então todos os três para InnoDB, porque eu li que MyISAM não suporta chaves estrangeiras. Todos os campos id são INT(11).

Quando eu escolher a mesa de foo_bar, clique no link "Ver relação", e tentar definir as colunas FK ser database.foo.id e database.bar.id, ele diz que "No índice definido!" ao lado de cada coluna.

O que eu estou ausente?

Esclarecimento / atualizar

Por uma questão de simplicidade, eu quero continuar usando o phpMyAdmin. Atualmente, estou usando XAMPP, que é fácil o suficiente para deixar me concentrar no PHP / CSS / Javascript, e ele vem com phpMyAdmin.

Além disso, embora eu não tenha sido capaz de configurar chaves estrangeiras explícitas ainda, eu tenho uma tabela relacional e pode executar junta-se assim:

SELECT * 
FROM foo 
INNER JOIN foo_bar 
ON foo.id = foo_bar.foo_id 
INNER JOIN bar
ON foo_bar.bar_id = bar.id;

Ela só me faz não desconfortável para ter os FKs explicitamente definidas no banco de dados.

Foi útil?

Solução

Se você quiser usar o phpMyAdmin para configurar as relações, você tem que fazer 2 coisas. Primeiro de tudo, você tem que definir um índice na coluna de chave estrangeira na tabela de referência (assim foo_bar.foo_id, no seu caso). Então, vá para a vista relação (na tabela de referência) e selecione a coluna referida (assim no seu caso foo.id) ea na atualização e sobre as ações de exclusão.

Eu acho que as chaves estrangeiras são úteis se você tiver várias tabelas ligados um ao outro, em particular, os seus scripts de exclusão se tornará muito curto, se você definir as opções que fazem referência corretamente.

EDIT:. Certifique-se de ambas as tabelas têm o motor InnoDB selecionado

Outras dicas

phpMyAdmin permite definir chaves estrangeiras usando seu ponto de vista "relações". Mas uma vez que, MySQL só suporta restrições de estrangeiros em tabelas "INNO DB", o primeiro passo é certificar-se as tabelas que você está usando são desse tipo.

Para configurar uma chave estrangeira para que a coluna PID em uma tabela chamada referências Criança A coluna ID em uma tabela chamada pai, você pode fazer o seguinte:

  1. Para ambas as tabelas, vá para a guia operações e alterar o tipo de "INNO DB"
  2. Certifique-se de ID é a chave primária (ou pelo menos uma coluna indexada) da tabela pai.
  3. Na tabela a criança, definir um índice para a coluna PID.
  4. Ao visualizar o separador estrutura da tabela filho, clique no link "relação view" logo acima da seção "adicionar campos".
  5. Você será dado uma tabela onde cada linha corresponde a uma coluna indexada na sua tabela CLIENT. A primeira suspensa em cada linha permite escolher quais Tabela-> COLUNA as referências coluna indexada. Na linha PID, escolha Parent> ID na lista suspensa e clique em Ir.

Ao fazer uma exportação na mesa da criança, você deve ver uma restrição de chave estrangeira foi criada para a coluna PID.

Este é um resumo de um artigo de Wikipedia. Ele especifica os diferentes tipos de relacionamentos que você pode estipular no phpMyAdmin. Estou colocando isso aqui porque é relevante para @ comentário de Nathan sobre a definição das chaves estrangeiras opções para "on update / delete", mas é muito grande para um comentário -. Espero que ajude

CASCADE

Sempre que linhas na tabela master (referenciada) são excluídos (resp. Atualizado), as respectivas linhas da criança (referência) tabela com uma coluna de correspondência de chave estrangeira vai ficar excluído (resp. Atualizado) também. Isso é chamado de uma cascata delete (resp. Update [2]).

Restringir

Um valor não pode ser atualizada ou excluída quando existe uma linha em uma tabela de chave externa que faz referência o valor na tabela referenciada. Da mesma forma, uma linha não pode ser excluído, desde que haja uma referência a ele a partir de uma tabela de chave externa.

NO ACTION

NO ACTION e restringir são muito parecidos. A principal diferença entre NO ACTION e restringir é que, com NENHUMA AÇÃO a verificação de integridade referencial é feito depois de tentar alterar a tabela. RESTRINGIR faz a verificação antes de tentar executar o UPDATE ou DELETE. Ambas as ações referenciais agir da mesma se a verificação de integridade referencial falha: UPDATE ou DELETE irá resultar em um erro

.

SET NULL

Os valores de chave estrangeira na linha de referência são definidos como NULL quando a linha referenciada é atualizado ou excluído. Isso só é possível se as respectivas colunas na tabela de referência são anulável. Devido à semântica de NULL, uma linha de referência com valores nulos nas colunas de chave estrangeira não requer uma linha referenciada.

SET DEFAULT

Semelhante ao SET NULL, os valores de chave estrangeira na linha de referência são definidos para o padrão da coluna quando a linha referenciada é atualizada ou excluída.

No phpMyAdmin, você pode atribuir a chaves estrangeiras simplesmente pela sua GUI. Clique na mesa e vá para a guia Estrutura. encontrar a Relação Vista em apenas abaixo da tabela (como mostrado na imagem abaixo).

 enter descrição da imagem aqui

Você pode atribuir a chave forjar a partir da lista perto da chave primária. (Veja a imagem abaixo). e salvar

 enter descrição da imagem aqui

correspondente consulta SQL gerado e executado automaticamente.

Para aqueles novos ao banco de dados .... e necessidade de alterar uma tabela existente. Um monte de coisas parecem ser bastante simples, mas há sempre algo ... entre A e B.

Antes de mais nada, dê uma olhada este .

  1. Certifique-se de que você tem P_ID (ID pai sobre o pai ea tabela filho).
  2. É claro que será já preenchido o pai. Não necessariamente na criança de uma forma verdadeira e final. Assim, por exemplo P_ID # 3 (talvez muitas vezes na tabela a criança vai estar apontando para P_ID original a tabela pai).
  3. Vá para a aba SQL (estou usando o phpMyAdmin, deve ser semelhante em outros) e fazer este comando:

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
    
  4. Clique na tabela filho, de estrutura, finalmente, em vista relacional. Termine o seu planejamento DB lá. Houve uma resposta agradável antes de este sobre cascata, restringir, etc. Claro que poderia ser feito por comandos ...

através chave estrangeira um atributo não primos de um referes tabela de atributos privilegiada de outra * em phpMyAdmin * primeiro definir a coluna que deseja definir chave estrangeira como um índice

, em seguida, clique em Visualizar RELAÇÃO

lá u pode encontrar as opções para definir chave estrangeira

InnoDB permite que você adicione uma nova restrição de chave estrangeira para uma tabela usando ALTER TABLE:

ALTER TABLE tbl_name
    ADD [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

Por outro lado, se MyISAM tem vantagens sobre InnoDB em seu contexto, por que você iria querer criar restrições de chave estrangeira em tudo. Você pode lidar com isso no nível do modelo da sua aplicação. Apenas certifique-se as colunas que você deseja usar como chaves estrangeiras são indexadas!

Não se esqueça que as duas colunas devem ter o mesmo tipo de dados.

Por exemplo, se uma coluna é do tipo INT eo outro é do tipo tinyint você poderá obter o seguinte erro:

Erro ao criar a chave estrangeira em [coluna PID] (tipos de dados de verificação)

Passo 1: Você tem que adicionar a linha: default-storage-engine = InnoDB sob a seção [mysqld] do arquivo de configuração mysql (my.cnf ou my.ini dependendo do seu OS) e reinicie o serviço mysqld. enter descrição da imagem aqui

Passo 2: Agora, quando você criar a tabela, você verá o tipo de tabela é: InnoDB

enter descrição da imagem aqui

Passo 3: Criar o pai ea tabela filho. Agora abra a tabela da Criança e selecione a coluna U gostaria de ter a chave estrangeira: Selecione a chave de índice de etiqueta Acção como mostrado abaixo.

enter descrição da imagem aqui

Passo 4: Agora abra a Relação Ver na mesma tabela criança de fundo perto da Imprimir Ver como mostrado abaixo.

enter descrição da imagem aqui Passo 5: Selecione a coluna U gostaria de ter a chave estrangeira como selecionar a coluna Parent do drop-down. dbName.TableName.ColumnName

Selecione os valores apropriados para ON DELETE e ON UPDATE enter descrição da imagem aqui

A partir da documentação oficial do MySQL em https : //dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html :

MySQL requer índices em chaves estrangeiras e chaves referenciados para que verificação de chaves estrangeiras pode ser rápido e não requerem uma verificação de tabela.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top