I'm configurando uma base 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 elas, utilizando suas chaves primárias como chaves estrangeiras.
Eu criei estas tabelas como MyISAM, mas desde então mudei as três para InnoDB, porque li que MyISAM não suporta't chaves estrangeiras. Todos os campos id' são
INT(11)`.
Quando eu escolher a tabela foo_bar
, clique no "relation view" link, e tente configurar as colunas FK para serem database.foo.id
e database.bar.id
, ele diz "Sem índice definido!" ao lado de cada coluna.
O que estou a perder?
Por uma questão de simplicidade, quero continuar a usar o phpMyAdmin. Atualmente estou usando o XAMPP, que é fácil o suficiente para me deixar focar no PHP/CSS/Javascript, e ele vem com o phpMyAdmin.
Além disso, embora eu tenha'ainda não tenha conseguido configurar chaves estrangeiras explícitas, tenho uma tabela relacional e posso realizar 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;
Só me deixa desconfortável não ter os FKs explicitamente definidos na base de dados.
Se você quer usar o phpMyAdmin para estabelecer 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 (então foo_bar.foo_id, no seu caso). Depois, vá para a visualização de relações (na tabela de referência) e selecione a coluna referida (assim no seu caso foo.id) e as ações de atualização e eliminação.
Eu acho que chaves estrangeiras são úteis se você tiver várias tabelas ligadas 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.
EDITAR: Certifique-se de que ambas as tabelas tenham o motor InnoDB selecionado.
O phpMyAdmin permite definir chaves estrangeiras usando o seu " relações" visualização. Mas como o MySQL só suporta restrições estrangeiras em "INNO DB" tables, o primeiro passo é certificar-se de que as tabelas que você está usando são 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, o usuário deve ver que foi criada uma restrição de chave estrangeira para a coluna PID.
O InnoDB permite adicionar uma nova restrição de chave estrangeira a uma tabela usando a 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ê quer criar restrições chave estrangeiras? Você pode lidar com isso no nível do modelo da sua aplicação. Apenas certifique-se de que as colunas que deseja usar como chaves estrangeiras estão indexadas!