Você não tem uma chave exclusiva no endereço de e-mail . Essa é sua melhor esperança, já que muitos John Doe podem estar no sistema. Portanto, um índice composto exclusivo no nome completo nem sempre é uma boa ideia.
Pode-se emitir um INSERT IGNORE que se arrasta após uma violação duplicada como se nada acontecesse (isso é altamente não recomendado e, no seu caso, não é possível porque sua restrição exclusiva no email não está presente). O maior problema em fazer isso é que sua tendência (leia-se:provavelmente) perderá todo o controle do fluxo do que está acontecendo e ficará com dados indesejados. Portanto, não use, a menos que você seja um profissional.
Pode-se emitir e INSERT ON DUPLICATE KEY UPDATE (também conhecido como IODKU) que também requer uma chave exclusiva (também pode ser um composto exclusivo). Como tal, uma nova linha não ocorreria, mas uma atualização para a linha. Como exemplo, uma nova linha com 4 colunas poderia ser inserida, mas em caso de violação de duplicação, uma atualização poderia ser realizada em apenas duas das colunas, como
assumindo abaixo um PK em uma coluna invisível
id int
, e uma chave exclusiva em emailAddr
insert person(firstName,lastName,emailAddr) values 'Joe','Smith','[email protected]'
on duplicate key update firstName='Joe',lastName='Smith'
É a chave exclusiva no emailAddr que faz isso funcionar. Deixado com apenas 1 linha por emailAddr, sempre.
Portanto, você pode ter Joe Smiths ilimitados, mas apenas 1 linha por endereço de e-mail.
A tabela de criação para a tabela acima pode se parecer com
create table person
( id int auto_increment primary key,
firstName varchar(50) not null,
lastName varchar(50) not null,
emailAddr varchar(150) not null,
unique key(emailAddr) -- without this, IODKU will not work
);
Você também pode emitir comandos ALTER TABLE para adicionar restrições após a criação da tabela. Dependendo dos dados nele contidos, a chamada pode falhar.
Mysql Inserir na atualização de chave duplicada e Alterar tabela páginas do manual.
Vou dizer novamente, sem a configuração adequada do esquema, o IODKU não funcionará e você ficará com linhas indesejadas. Então não seja preguiçoso sobre isso. Esquema de configuração primeiro permitindo o sucesso (com chaves exclusivas), então avançar para o uso de IODKU.