Atualizando registros no MySQL

11/09/06

Se você programa em PHP, muito provavelmente já fez algum projeto utilizando banco de dados MySQL. Nem todo mundo conhece algumas funcionalidades que as versões mais novas tem, como a diretriz ON DUPLICATE KEY UPDATE.

Funciona muito bem em aplicações CRUD. Veja um exemplo:

/* MySQL Dump */
CREATE DATABASE url_counter;
CREATE TABLE urls (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20),
    hits INT DEFAULT '0',
    last_visit DATETIME
);

Agora, no PHP, poderíamos ter algo assim:

function insert_url($name)
{
    $query = sprintf("
    INSERT INTO urls 
        (name) VALUES ('%s')
    ", mysql_real_escape_string($name));
    mysql_query($query);
}
 
function update_url($id) {
    $query = sprintf("UPDATE urls SET hits=hits+1 WHERE id=%d", $id);
    mysql_query($query);
}

Agora, se você utilizar a diretriz ON DUPLICATE KEY, é possível fazer tudo isso com apenas uma função:

function url($name, $id='')
{
    $query = sprintf("
    INSERT INTO urls
        (id, name, last_visit, hits)
    VALUES
        (%d, '%s', NOW(), 1)
    ON DUPLICATE KEY UPDATE
        hits=hits+1,
        last_visit=NOW()
    ", $id, $name);
    
    mysql_query($query);
}
 
url('http://google.com/');
url('http://google.com/', 1);
url('http://google.com/', 1);
 
url('http://yahoo.com/');
url('http://yahoo.com/', 2);

Caso o registro não exista, ele adiciona. Se existir, o MySQL atualiza automaticamente os campos indicados na diretriz ON DUPLICATE KEY. Interessante, huh?

Comentários #


#1 Marcos V BOhrer disse:
12 Out 06, 05:47PM

Olá Nando

Quais as versões usadas no exemplo?

#2 Nando Vieira disse:
13 Out 06, 12:49AM

Olá Marcos! Essa funcionalidade do MySQL foi implementada à partir da versão 4.1.

#3 Rodrigo Gregório disse:
09 Fev 08, 11:54PM

Muito interessante o seu artigo ,deu para perceber que v entende de mysql e php.
Agora uma dúvida vc sabe como atualizar dados no mysql através de uma resposta do json ???

Ex de resposta: {"update": [{"000000001":"15.0000":"99.000"}, {"000000002":"62.5000":"99.000"}, {"000000003":"120.0000":"99.000"}, {"000000004":"180.0000":"99.000"}]}

#4 Nando Vieira disse:
10 Fev 08, 09:02PM

Você vai ter que passar isso pela aplicação antes. No caso do PHP, use o json_decode.

Mas veja bem. Esse código que você postou é inválido. Não existe tal sintaxe. O correto seria ter objetos da seguinte maneira: [{"atributo" : "valor"}]. No seu exemplo tem 2 dois-pontos, quando atributos são separados por apenas um.

#5 Rodrigo Gregorio disse:
30 Abr 08, 05:26PM

Olá esta googlando agora e vi esse assunto na busca entrei no site para olhar,adicionei no delicious fui lá no php.net vi os exemplos ,voltei aqui ,quem tinha perguntado,advinha…

Obrigado pela dica!

Deixe um comentário




Este blog usa o Gravatar.


Não é aceito código HTML:
adicione-o no pastie.caboo.se ou paste.milk-it.net e poste apenas o link.

Se este é seu primeiro comentário, ele terá que ser aprovado antes de ser exibido.