Campo auto-incremento e chave composta no MySQL: Por que não tenho sucesso? Quando não usar?

Jack estou com um problema, estou fazendo o trabalho solicitado e na parte de cadastro de clientes tenho 5 campos;

Nome
Login
Senha
Email
Código do cliente

Aonde necessito que o Código do Cliente seja chave estrangeira, e nome, login e email sejam chaves primárias. Defini todos exceto senha como chave primária, só que ai então não funciona o auto-incremento do campo código, todos os cadastros passam a ter o código 1, gostaria de saber como resolver isto e como efetuar a confirmação de login e senha.

Algumas considerações acerca do seu questionamento:

– No MySQL, a exemplo de uma grande maioria dos SGBDs, um campo só pode ser auto-incremento se este for chave primária. Assim sendo, é perfeitamente normal que ele não execute o que você está esperando. Resumindo: Se você quiser usar auto-incremento o campo vai precisar ser chave primária!

– Ao criar os campos “nome”, “login” e “email” como chaves primárias, você acaba de constituir uma chave composta, ou seja, uma chave que de fato serve para indexar/ordenar e garantir o aspecto unique (registro único na tabela de dados), no entanto, uma chave primária composta por 3 campos. Isso pode ser bastante útil em exemplos e aplicações menores ou onde é explícita a necessidade de se garantir com rigidez a não duplicidade de registros que tenham o nome, o login e o email iguais (lembrando que qualquer caracter informado diferentemente no nome, por exemplo, faz a chave composta entender como diferentes dois registros iguais). Contudo, em aplicações maiores, com uma quantidade grande de transações e registros, chaves compostas acabam gerando índices internos no banco de dados bastante pesados e grandes (o que depõe negativamente em relação a performance do software como um todo). É um recurso que precisa ser usado com bastante cuidado!

– Para certificar-se que  o login ainda não foi incluído, caso este não seja um campo do tipo chave primária, antes da instrução insert, você pode utilizar um select afim de pesquisar na base por ocorrências correspondentes ao login pretendido pelo novo usuário. Neste caso, basta utilizar, após a query do select, a função mysql_affected_rows(), que retorna a contabilização de quantos (se é que houve algum) registros foram afetados durante o select. É notório que um select juntamente com um insert ou, imediatamente antes de um insert, pode provocar problemas com performance quando de uma tabela de dados com uma quantidade mais elástica de registros. Neste caso, pode ser interessante a eliminação do campo “código” e a promoção do campo “login” para o status de chave primária.