2

データベースに行が存在しない場合は指定された ID で作成し、そうでない場合はその行を更新するコードがあります。少し遅いです(行が存在するかどうかを確認してから挿入/更新します)、最適化したいと思います。全体を 1 つの SQL クエリに統合するにはどうすればよいですか? INSERT ... ON DUPLICATE KEY UPDATE を使用する必要があると思いますが、その仕組みがわかりません。ありがとうございました。

$objectExists = true;
try {
    $object = new Object();
    $object->loadFromDatabaseById($this->id, $dbh); // tries to load object from database, throws
                                         // ExceptionNotFound if object with specified id does not exist
}
catch(ExceptionNotFound $e) {
    $objectExists = false;
}

if($objectExists)
    $sth = $dbh->prepare(
        'UPDATE objects ' .
        'SET property1 = :property1, ' .
            'property2 = :property2, ' .
            'property3 = :property3 ' .
        'WHERE id = :id'
    );
else
    $sth = $dbh->prepare(
        'INSERT INTO objects ' .
        'SET id = :id, ' .
            'property1 = :property1, ' .
            'property2 = :property2, ' .
            'property3 = :property3'
    );
$sth->bindParam(':id', $this->id, \PDO::PARAM_INT);
$sth->bindParam(':property1', $this->property1, \PDO::PARAM_STR);
$sth->bindParam(':property2', $this->property2, \PDO::PARAM_STR);
$sth->bindParam(':property3', $this->property3, \PDO::PARAM_INT);
$sth->execute();
$this->id = (int)$this->id;
4

2 に答える 2

1

MySQL には、REPLACE探していることを正確に実行するステートメントがあります。

REPLACEは とまったく同じように機能しますが、テーブル内の古い行がまたはインデックスINSERTの新しい行と同じ値を持つ場合、新しい行が挿入される前に古い行が削除される点が異なります。PRIMARY KEYUNIQUE

削除のない代替案は次のINSERT ... ON DUPLICATE KEY UPDATEステートメントです。

を指定し、インデックスまたはON DUPLICATE KEY UPDATEで重複値を引き起こす行が挿入された場合、MySQL は古い行の を実行します。UNIQUEPRIMARY KEYUPDATE

于 2013-06-23T16:10:12.890 に答える