A função db_merge () do Drupal faz um UPDATE ou um INSERT dependendo se o registro existe.

Já desejou realizar um UPDATE se existir uma linha do banco de dados, ou um INSERT se não existir com os mesmos dados? Acontece que a maioria dos motores SQL tem uma instrução MERGE ( MySQL , TSQL , Oracle ) que faz exatamente isso.

API de banco de dados do Drupal tem um invólucro em torno do instrução MERGE também , db_merge()que vai cuidar das diferenças de sintaxe entre seus bancos de dados.

Por exemplo, se eu quisesse criar ou atualizar uma entrada na blocktabela (ou seja: atribuir um bloco a uma região em um tema), eu faria isso:

$query = db_merge('block')
->key(array(
'module' => 'system',
'delta' => 'powered-by',
'theme' => 'bartik',
))
->fields(array(
'status' => 1,
'weight' => 10,
'region' => 'footer',
'pages' => '',
'cache' => -1,
))
->execute();

A declaração acima seria equivalente a:

$exists_query = db_select('block')
->condition('module', 'system')
->condition('delta', 'powered-by')
->condition('theme', 'bartik')
->countQuery();

if ($exists_query > 0) {
db_update
('block')
->fields(array(
'status' => 1,
'weight' => 10,
'region' => 'footer',
'pages' => '',
'cache' => -1,
))
->condition('module', 'system')
->condition('delta', 'powered-by')
->condition('theme', 'bartik')
->execute();
}
else {
db_insert
('block')
->fields(array(
'module' => 'system',
'delta' => 'powered-by',
'theme' => 'bartik',
'status' => 1,
'weight' => 10,
'region' => 'footer',
'pages' => '',
'cache' => -1,
))
->execute();
}