2011-06-28 13 views
3

すべてのデータベースドライバで動作するPDOのINSERT IGNOREへの一般的な方法はありますか?PDOで挿入すると重複キーを無視します

ない場合、それは次のようにうまくいくと仮定する公平である:

try { 
    $stmt = $db->prepare("INSERT INTO link_table (id1, id2) VALUES (:id1, :id2)"); 
    $stmt->execute(array(':id1' => $id1, ':id2' => $id2)); 
} 
catch (PDOException $ex) { 
    // Thanks to comment by Mike: 

    // Re-throw exception if it wasn't a constraint violation. 
    if ($ex->getCode() != 23000) 
     throw $ex; 
} 
+0

@Haim Evgiをチェックするために必要かもしれないと思う 'INSERT IGNORE INTO'はMySQLでのみ動作する非標準のSQL機能です。 –

答えて

2

をコミットしていない挿入すべてのデータベースドライバで動作するバージョンです。 INSERT IGNOREINSERT...ON DUPLICATE KEY UPDATEはMySQL固有のものです。

既存のレコードを最初に選択してチェックするか、既存のレコードを削除して再挿入すると、競合状態や可能性のある外部キー制約違反、カスケード削除などの問題が発生しやすくなります。

あなたのアプローチはおそらく最も安全だと思います。あなたは、例外の原因を特定したい場合は、常にcheck the error codeことができます - 参照:

http://docstore.mik.ua/orelly/java-ent/jenut/ch08_06.htm

を私はあなたが私が読んだものからコード23000

1

あなたのコードはおそらく動作しますが、PDOのステートメントを実行しながら、間違って行くことができ、他のものがあります。制約違反を本当に受け取っているかどうか、違う種類でない場合でもチェックすることをお勧めします(たとえば、対応する行を持たない値のペアを参照テーブル)。 AFAIK、これを達成するためのクロスDBMSの方法はありません。トランザクションをサポートするのDBMSのために

(オラクル、SQL Serverの、PostgreSQLのは、MySQLある程度までは、...)、ここでは異なるアプローチです:

  1. 開始トランザクション
  2. は行に一致するすべての行を削除します挿入される(0または1行を削除)
  3. は、私の知る限りないジェネリックがない
関連する問題