Estou configurando um banco de dados usando o phpMyAdmin. Eu tenho duas tabelas ( foo
e 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 id
campos são INT(11)
.
Quando eu escolher a foo_bar
tabela, clique no link "Ver relação", e tentar definir as colunas FK ser database.foo.id
e 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.
fonte
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:
Ao fazer uma exportação na tabela CHILD, você verá que uma restrição de chave estrangeira foi criada para a coluna PID.
fonte
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.
fonte
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).
Você pode atribuir a chave de forjamento na caixa de listagem próxima à chave primária (veja a imagem abaixo). e salve
consulta SQL correspondente gerada e executada automaticamente.
fonte
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 .
Vá para a guia SQL (estou usando o phpMyAdmin, deve ser semelhante nos outros) e execute este comando:
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 ...
fonte
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
fonte
O InnoDB permite adicionar uma nova restrição de chave estrangeira a uma tabela usando ALTER TABLE:
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!
fonte
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)
fonte
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.
Etapa 2: Agora, quando você criar a tabela, verá que o tipo de tabela é: InnoDB
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.
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.
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
fonte
Primeiro defina o Storage Engine como InnoDB
então a opção de visualização de relação é ativada no menu estrutura
fonte
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
customer
está a tabela principal ecustomer_id
é a chave primáriaetapa 3 . criar tabela de chave estrangeira e dar índice
aqui temos
customer_addresses
como tabela relacionada e armazenamos endereços de clientes, então aquicustomer_id
relação comcustomer
tabelapodemos selecionar o índice diretamente ao criar a tabela como abaixo
Se você esqueceu de fornecer o índice ao criar uma tabela , pode fornecer o índice na guia estrutura da tabela, como abaixo.
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
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
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.
fonte
Na documentação oficial do MySQL em https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html :
fonte
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
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.
fonte