Atualizando registros no MySQL


Leia em menos de um minuto

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?