Configurando chaves estrangeiras no phpMyAdmin?

335

Estou configurando um banco de dados usando o phpMyAdmin. Eu tenho duas tabelas ( fooe bar), indexadas em suas chaves primárias . Estou tentando criar uma tabela relacional ( foo_bar) entre eles, usando suas chaves primárias como chaves estrangeiras.

Criei essas tabelas como MyISAM, mas desde então as três foram alteradas para InnoDB, porque li que o MyISAM não suporta chaves estrangeiras. Todos os idcampos são INT(11).

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

o que estou perdendo?

Esclarecimento / Atualização

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

Além disso, embora eu não tenha sido capaz de configurar chaves estrangeiras explícitas ainda, eu tenho uma tabela relacional e posso executar junções como esta:

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

Apenas me sinto desconfortável por não ter os FKs definidos explicitamente no banco de dados.

Nathan Long
fonte

Respostas:

365

Se você deseja usar o phpMyAdmin para estabelecer relações, você deve fazer duas coisas. Primeiro, você deve definir um índice na coluna de chave estrangeira na tabela de referência (então foo_bar.foo_id, no seu caso). Em seguida, vá para a visão de relação (na tabela de referência) e selecione a coluna referida (no seu caso, foo.id) e as ações on update e delete.

Eu acho que chaves estrangeiras são úteis se você tiver várias tabelas vinculadas umas às outras, em particular, seus scripts de exclusão se tornarão muito curtos se você definir as opções de referência corretamente.

EDIT: Verifique se as duas tabelas têm o mecanismo InnoDB selecionado.

rael_kid
fonte
93
Dica: Relações vista é pouco link em sua mesa, era difícil para mim encontrá-lo em primeiro lugar
Mladen Janjetovic
14
A menos que o link não apareça lá, nesse caso: Verifique se sua tabela é do tipo InnoDB (na guia Operações no phpMyAdmin) para que isso não aconteça.
muttley91
4
Minha tabela é o InnoDB. Eu verifiquei duas vezes. O link ainda não aparece.
afilina
6
@afilina Na nova versão do phpMyAdmin, é visível na parte superior dentro aba "Estrutura", logo abaixo da linha do separador que mostra "Browse", "Estrutura", etc.
Astitva Srivastava
225

O phpMyAdmin permite definir chaves estrangeiras usando a visualização "relações". Mas como o MySQL suporta apenas restrições estrangeiras nas tabelas "INNO DB", o primeiro passo é garantir que as tabelas que você está usando sejam desse tipo.

Para configurar uma chave estrangeira para que a coluna PID em uma tabela chamada CHILD faça referência à coluna ID em uma tabela chamada PARENT, você pode fazer o seguinte:

  1. Para ambas as tabelas, vá para a guia de operações e altere seu tipo para "INNO DB"
  2. Verifique se o ID é a chave primária (ou pelo menos uma coluna indexada) da tabela PARENT.
  3. Na tabela CHILD, defina um índice para a coluna PID.
  4. Enquanto visualiza a guia de estrutura da tabela CHILD, clique no link "visualização de relação" logo acima da seção "adicionar campos".
  5. Você receberá uma tabela em que cada linha corresponde a uma coluna indexada na sua tabela CLIENT. O primeiro menu suspenso em cada linha permite escolher qual TABELA-> COLUNA a coluna indexada faz referência. Na linha do PID, escolha PAI-> ID no menu suspenso e clique em IR.

Ao fazer uma exportação na tabela CHILD, você verá que uma restrição de chave estrangeira foi criada para a coluna PID.

awais
fonte
2
Uau, coisa muito importante a saber. Esta página não foi a primeira coisa que encontrei ao procurar ajuda para adicionar uma chave estrangeira. Gostaria que isso fosse mencionado com mais frequência.
user1299656
86

Este é um resumo de um artigo da Wikipedia. Ele especifica os diferentes tipos de relacionamentos que você pode estipular no PHPmyadmin. Estou colocando aqui porque é relevante para o comentário do @ Nathan sobre a configuração das opções de chaves estrangeiras para "na atualização / exclusão", mas é muito grande para um comentário - espero que ajude.

CASCATA

Sempre que as linhas na tabela principal (referenciada) forem excluídas (atualizadas), as respectivas linhas da tabela filha (referência) com uma coluna de chave estrangeira correspondente também serão excluídas (atualizadas). Isso é chamado de exclusão em cascata (resp. Atualização [2]).

RESTRINGIR

Um valor não pode ser atualizado ou excluído quando existe uma linha em uma tabela de chave estrangeira que referencia o valor na tabela referenciada. Da mesma forma, uma linha não pode ser excluída desde que haja uma referência a ela de uma tabela de chave estrangeira.

SEM AÇÃO

NENHUMA AÇÃO e RESTRITO são muito parecidas. A principal diferença entre NO ACTION e RESTRICT é que, com NO ACTION, a verificação de integridade referencial é feita após tentar alterar a tabela. RESTRICT faz a verificação antes de tentar executar a instrução UPDATE ou DELETE. Ambas as ações referenciais agem da mesma forma se a verificação de integridade referencial falhar: a instrução UPDATE ou DELETE resultará em um erro.

SET NULL

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

CONJUNTO PADRÃO

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

Brett
fonte
11
Melhor ainda, ir diretamente para a documentação fonte MySQL: dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
kmoser
62

No phpmyadmin, você pode atribuir chave estrangeira simplesmente por sua GUI. Clique na tabela e vá para a guia Estrutura. encontre a Visão de Relação logo abaixo da tabela (mostrada na imagem abaixo).

insira a descrição da imagem aqui

Você pode atribuir a chave de forjamento na caixa de listagem próxima à chave primária (veja a imagem abaixo). e salve

insira a descrição da imagem aqui

consulta SQL correspondente gerada e executada automaticamente.

Nishad Up
fonte
16

Para quem é novo no banco de dados ... e precisa ALTERAR uma tabela existente. Muitas coisas parecem bem diretas, mas sempre há algo ... entre A e B.

Antes de mais nada, dê uma olhada nisso .

  1. Verifique se você possui P_ID (ID pai na tabela pai e filho).
  2. Claro que já será preenchido pelo pai. Não necessariamente na criança de uma maneira verdadeira e final. Por exemplo, P_ID # 3 (talvez muitas vezes na tabela filho aponte para P_ID original na tabela pai).
  3. Vá para a guia SQL (estou usando o phpMyAdmin, deve ser semelhante nos outros) e execute este comando:

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
  4. Clique na tabela filho, depois na estrutura, finalmente na exibição relacional. Conclua seu planejamento de banco de dados lá. Antes, havia uma boa resposta sobre cascata, restrição, etc. É claro que isso poderia ser feito por comandos ...

user2060451
fonte
9

Chave estrangeira significa que um atributo não primário de uma tabela refere o atributo principal de outro * no phpMyAdmin * primeiro defina a coluna que você deseja definir a chave estrangeira como um índice

depois clique em RELATION VIEW

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

Shafeeq M kunjumoideen
fonte
7

O InnoDB permite adicionar uma nova restrição de chave estrangeira a 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 o MyISAM tem vantagens sobre o InnoDB no seu contexto, por que você deseja criar restrições de chave estrangeira? Você pode lidar com isso no nível do modelo do seu aplicativo. Apenas verifique se as colunas que você deseja usar como chaves estrangeiras estão indexadas!

markus
fonte
4
As restrições de chave estrangeira me poupam muito esforço e possíveis erros. Por exemplo, digamos que vou excluir um usuário do meu sistema. Eu poderia escrever um código que especifique todos os lugares no banco de dados em que existem dados sobre esse usuário e pedir para excluí-lo. Mas eu tenho que manter essa função de exclusão sempre atualizada. Por outro lado, se todos os dados relacionados ao usuário tiverem um FK para o ID do usuário e estiverem configurados para cascata ao serem excluídos, todo o meu código deve dizer é "excluir este usuário" e o banco de dados cuidará de excluir tudo o que tiver uma referência FK para esse usuário. Muito mais limpo para manter.
Nathan Long
11
@ Nathan: É o que estou dizendo no post. Você também pode lidar com isso no nível do modelo. Você pode implementar na exclusão em cascata do modelo.
Markus
3
Você quase sempre adiciona integridade referencial às suas tabelas de banco de dados. O banco de dados deve se proteger de uma programação incorreta de aplicativos. Não confie apenas no seu aplicativo para manter a integridade dos dados. Claro que sempre há exceções para todas as regras, mas não encontrei uma para isso.
Harv
4

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

por exemplo, se uma coluna for do tipo INT e a outra for do tipo tinyint, você receberá o seguinte erro:

Erro ao criar chave estrangeira em [coluna PID] (verifique os tipos de dados)

pouya
fonte
3

Etapa 1: Você deve adicionar a linha: default-storage-engine = InnoDB na seção [mysqld] do seu arquivo de configuração do mysql (my.cnf ou my.ini, dependendo do sistema operacional) e reiniciar o serviço mysqld. insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

Etapa 3: Crie a tabela pai e filho. Agora abra a tabela filho e selecione a coluna U gostaria de ter a chave estrangeira: Selecione a chave de índice no rótulo da ação, como mostrado abaixo.

insira a descrição da imagem aqui

Etapa 4: Agora abra a Visualização de Relação na mesma tabela filha, de baixo, perto da Visualização de Impressão, como mostrado abaixo.

insira a descrição da imagem aqui Etapa 5: selecione a coluna U para ter a chave estrangeira como Selecione a coluna Pai na lista suspensa. dbName.TableName.ColumnName

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

Vinod
fonte
2

Primeiro defina o Storage Engine como InnoDB

Primeiro defina o Storage Engine como InnoDB

então a opção de visualização de relação é ativada no menu estrutura

então a opção de visualização de relação ativa

Sahil Ralkar
fonte
seu primeiro passo está correto, mas e o próximo passo, escreva todo o processo passo a passo.
Shaktawat kunal
2

Este é um tópico antigo, mas responda, porque se for útil a alguém.

Etapa 1 . Seu Db Storage Engine definido como InnoDB

Passo 2 . Criar tabela primária

aqui customerestá a tabela principal e customer_idé a chave primária

insira a descrição da imagem aqui

etapa 3 . criar tabela de chave estrangeira e dar índice

aqui temos customer_addressescomo tabela relacionada e armazenamos endereços de clientes, então aqui customer_idrelação comcustomer tabela

podemos selecionar o índice diretamente ao criar a tabela como abaixo

insira a descrição da imagem aqui

Se você esqueceu de fornecer o índice ao criar uma tabela , pode fornecer o índice na guia estrutura da tabela, como abaixo.

insira a descrição da imagem aqui

Etapa 4 . Depois que o índice for para o campo, vá para a guia estrutura e clique em Visualização de Relação, como mostrado na figura abaixo

insira a descrição da imagem aqui

Etapa 5 . Agora selecione ON DELETE e ON UPDATE o que você deseja fazer, selecione a coluna da tabela atual, selecione DB (SAME DB), selecione a tabela de relações e a chave primária dessa tabela, conforme mostrado na figura abaixo e salve -a

insira a descrição da imagem aqui

Agora verifique se a relação é fornecida com êxito, vá para a lista de dados da tabela estrangeira e clique no valor da chave estrangeira, você será redirecionado para o registro da tabela primária e, em seguida, a relação feita com sucesso.

Devsi Odedra
fonte
0

As versões mais recentes do phpMyAdmin não possuem mais a opção " Relation View ". Nesse caso, você terá que executar uma instrução para obter a mesma coisa. Por exemplo

ALTER TABLE employees
    ADD CONSTRAINT fk_companyid FOREIGN KEY (companyid)
    REFERENCES companies (id)
    ON DELETE CASCADE;

Neste exemplo, se uma linha das empresas for excluída, todos os funcionários com esse ID da empresa também serão excluídos.

Vincent
fonte