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





Não é aceito código HTML: adicione-o no pastie.org 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.

JavaScript Avançado

O JavaScript é a única linguagem que muitos acreditam saber sem nunca terem parado para realmente aprendê-la. Neste workshop rápido você entenderá de verdade todos os conceitos avançados do JavaScript em 4 horas puramente práticas.

Saiba mais Fechar

Conheça também o HOWTO