Home > Programação > Insert e Select na mesma query mySql

Insert e Select na mesma query mySql

Janeiro 11th, 2007

Boas pessoal. Bem sei que tenho estado ao ausente, mas também não quero estar a escrever artigos “nonsense”. Pois bem aqui vai uma técnica que descobri hoje. Como criar uma query INSERT com um SELECT no seu interior de forma a poupar uma segunda query.Muitas vezes queremos introduzir dados na nossa base de dados, mas um ou mais dados dependem de outra tabela. O que fazemos neste caso?

Na minha concepção programática (existe esta palavra?) existem basicamente duas formas, a “Tapa Buraco, Tá a despachar” e a “Vou perder um bocado para arranjar uma forma mais correcta, porque eu quero aprender mais sobre este tema”. Bem vamos ao que interessa:

Temos duas tabelas. “noticia” e “foto_noticia”.

noticia - id, data, titulo, conteudo.

foto_noticia - id, foto, noticia.

Eu pretendo apartir de um formulário criar uma noticia e também colocar fotos associadas a essa noticia, tudo de uma só vez. Como não sei quantas fotos a noticia pode ter, estas duas tabelas estão relacionadas (o campo noticia na tabela foto_noticia é chave estrangeira do campo id da tabela noticia).

Método nr. 1 (”O Tapa Buracos”):

query_add_noticia -> INSERT INTO noticia (data,titulo,conteudo) VALUES ( ‘[data]‘,’[titulo]‘,’[conteudo]‘);

query_ultima_noticia -> SELECT id FROM noticia WHERE data = ‘[data]‘ AND titulo = ‘[titulo]‘); // Qual é a probabilidade de existirem duas noticias criadas exactamente ao mesmo tempo elevado ao segundo e com o mesmo titulo ??? :\

query_add_foto -> INSERT INTO foto_noticia (foto,noticia) VALUES (’[foto]‘,’[resultado da ultima leitura para existir a relação entre a foto e a noticia]‘);

Agora vou vos mostrar como poupar uma query e elevar um pouco o estado de espírito das querys do mysql no nosso código php (como noutras linguagens ou etc) com a técnica boa.

Método nr. 2 ( O método “Bom”):

query_add_noticia -> INSERT INTO noticia (data,titulo,conteudo) VALUES ( ‘[data]‘,’[titulo]‘,’[conteudo]‘);

query_add_foto -> INSERT INTO foto_noticia (foto,noticia) SELECT ‘[foto]‘, id FROM noticia WHERE data = ‘[data]‘ AND titulo = ‘[titulo]‘ ;

Viram? Experimentem, é bem simples. Alguma dúvida é só comentar. Sim comentem, que eu estou aqui é para ajudar.

Inté 8)

P.S: Se virem alguma desvantagem neste método, comentem o artigo com a vossa opinião. Ela conta… Muito mesmo… ;)

Programação ,

  1. LKRaider
    Janeiro 22nd, 2007 at 17:20 | #1

    Muito bom a dica!

    Você pode ainda usar a função LAST_INSERT_ID() pra pegar o Último ID criado. Ficaria assim:

    INSERT INTO foto_noticia (foto, noticia) SELECT ‘[foto]‘, LAST_INSERT_ID();

    Na verdade, este Último funciona até mesmo sem declarar o select, usando só o values normal:

    INSERT INTO foto_noticia (foto, noticia) VALUES (’[foto]‘, LAST_INSERT_ID());

  2. Janeiro 23rd, 2007 at 12:47 | #2

    Boas LKRaider.

    Obrigado pela tua dica. Desconhecia essa função do mySQL.

    Se alguém souber algum site (para alem da documentação do mySQL) que contenha descrição de funções úteis, não hesitem em nos mostrar.

    Mais uma vez um obrigado LKRaider pela tua excelente dica. Ficará aqui registada.

    Inté 8)

  1. No trackbacks yet.