NICRUO.COM

Multiplos INSERTs e IGNORE no mySQL

Boas a todos vós.

Como podem ter percebido andei desaparecido, mas como já expliquei antes, quero aqui colocar algo de interessante e não andar a encher baldes de m**** no blog. Aqui vai mais um artigo interessante a meu ver.

Alguma vez viram a necessidade de colocar montes de dados na base de dados ao mesmo tempo? E alguma vez esses dados eram Únicos e se repetidos teriam de ser ignorados? Pois bem, hoje aconteceu isso comigo ao criar um gestor de contactos de emails e digo-vos desde já que a minha solução passou a reduzir o tempo de execução da página umas “milhentas” vezes.

Tudo começou quando tinha de inserir numa tabela mais de 20000 registos dos quais tinham alguns repetidos e na tabela também já existiam possí­veis repetições. Ora como eu queria que email repetidos não existissem na tabela, o meu campo ‘email’ foi colocado no estado “Único”. Desta forma sempre que fizesse um Insert ele daria um erro que já existia o email se eu coloca-se repetido. Ora para resolver este problema de inicio fiz algo do género (isto é pseudo-código, pessoal não stressem de não funcionar porque em principio não funciona mesmo):

para_cada_um_dos_email
{
 executa_a_query("INSERT INTO user (email)
                          VALUES ('$um_dos_emails')");

}

Ora isto é muito bonito quando temos de adicionar poucos registos de uma vez, mas não é a forma correcta de se fazer as coisas.

Em vez disso depois pôs me a pensar e investigando um pouco descobri que a função INSERT permite-nos inserir múltiplos valores ao mesmo tempo:

INSERT INTO user (email) VALUES ('$um_email'),('$outro_email'),
('$e_outro_email'),'$e_etc_emails'),...

Ora desta forma em vez de fazer várias chamadas ao mysql, faço só uma. Assim poupo o servidor e poupo tanto o php como o mysql de terem um ataque cardíaco.

Mas (sim há um mas), imaginemos que na tabela já existem emails, e que possivelmente um ou vários dos meus novos emails já existem na tabela. Desta nova forma a query dá erro porque existe uma repetição. Da primeira forma isto não acontecia mas não uma opção usar uma forma errada para solucionar um problema. Então descobri também que o INSERT tem uma opção que faz exactamente o que queremos: IGNORE.

Desta forma passamos a executar o Insert múltiplo e o que antes dava erro por repetição passa a ser um Warning ou seja ignora os repetidos e não chateia mais:

INSERT IGNORE INTO user (email) VALUES ('$um_email'),('$outro_email'),
('$e_outro_email'),('$e_etc_emails'),...

Sem stress, ficamos com a query a funcionar e fazemos da forma correcta (alguém sabe uma forma ainda melhor? é só dizer).

Espero que tenham apreciado o artigo. Eu gostei de descobrir isto, agora é com vocês como lhe dão uso.

Inté 8)

Deixe o seu comentário