So setzen Sie 'INSERT IGNORE' in db_insert ohne db_merge

8

Weiß jemand, wie man 'INSERT IGNORE' in db_insert setzt?

Ich kann db_merge nicht verwenden, da ich viele Zeilen einfügen werde.

$query = db_insert('table')->fields(array('foo', 'bar'));
foreach ($rows as $row) {
  $query->values(array(
    'foo' => $row->foo,
    'bar' => $row->bar,
  ));
}
$query->execute();
mrded
quelle

Antworten:

5

Sie haben zwei Möglichkeiten:

  1. Unterklassen InsertQueryund fügen Sie diese Funktionalität in sich selbst hinzu (sie ist derzeit nicht implementiert).
  2. Verwenden Sie db_query()stattdessen, um eine unformatierte SQL-Zeichenfolge auszuführen.

Die einzige Erwähnung INSERT IGNOREin der Drupal 7-Codebasis ist in DatabaseConnection_mysql:nextId; Es wird nicht wirklich verwendet, aber an seiner Stelle befindet sich eine rohe Abfragezeichenfolge ON DUPLICATE KEY UPDATE, die direkt an übergeben wird db_query().

Ich kann mich irren, aber ich würde annehmen, dass dies ein ebenso guter Hinweis ist wie jeder andere, dass eine rohe SQL-Zeichenfolge zusammen mit db_query()der richtige Weg ist.

Clive
quelle
3

Obwohl es nicht möglich ist, "INSERT IGNORE" zu verwenden, gibt es eine Möglichkeit, dies in PHP zu umgehen. Etwas wie das:

try {
    $insertID = db_insert('crawl_data')->fields(array(
        'url' => $url, 
    ))->execute();
} catch (Exception $ex) {

}

In diesem Beispiel habe ich eine Datenbank mit "URLs". Aber ich möchte nicht zuerst überprüfen, ob sich das Element in der Datenbank befindet. Ich möchte, dass es auf einmal passiert. Dies ist also ungefähr das gleiche Verhalten wie "Einfügen ignorieren".

Es ist jedoch im Allgemeinen schlecht, dies zu haben:

catch (Exception $ex) {
    // open space
}

Es könnte also besser sein, dies zu tun:

catch (Exception $ex) {
    $error = $ex->getMessage();
    if (strpos($error, 'SQLSTATE[23000]: Integrity constraint violation') !== false) {
        // then we know it's an error we can ignore
    }
    else {
        // just throw the error again
        throw $e;
    } 
}

Entweder dies oder zwei Datenbankabfragen.

Coderama
quelle