2011-02-04 6 views
0

最近、SQLiteを読んで、実際にSQLiteを使っています。SQLiteのアップデートでフィールドがヌル値に置き換えられています

これは私が必要とするもの、つまりメモリ内のデータベースに最適です。しかし、私が抱えている問題は、レコードが重複しているということです。レコードを挿入するだけでしたが、既に存在する場合は、欠落しているフィールドを埋めてください。

私が試した最初の方法は、主キーとしてIDを設定し、INSERT OR REPLACEを設定することでした。この問題は以前の内容が一掃されたことでした。

ここで私がやっていることは、更新クエリです。私は彼らが変更された行の数をチェックしています。その1より小さい場合、私は挿入クエリを実行します(これが余分なオーバーヘッドを持っていることを知っているので、より良い方法で共有してください)。

とにかく私の問題(最終的に..)は、更新クエリでもレコードがヌル値で上書きされているということです。

アイブは、以下のコードの断片を凝縮:

$stmt1 = $db->prepare("UPDATE results SET 
     field1=?, field2=?, field3=? 
     WHERE id=? 
    "); 

    $stmt1->execute(array(
     $elm['content1'], $elm['content2'], $elm['content3'], $elm['id'] 
    )); 

    $count = $stmt1->rowCount(); 

    if ($count < 1) { 
     $stmt2 = $db->prepare("INSERT INTO results (id, field1, field2, field3) 
      VALUES (:id,:field1, :field1, :field1) 
     "); 

     $stmt2->execute(array(":id" => $recordID, ":field1" => $elm['content1'], ":field2" => $elm['content2'], ":field3" => $elm['content3']));  
    } 

を上記のforeachループ内で起こっています。

コンテンツが上書きされても、そのコンテンツはすでにデータベースに存在していれば、そのコンテンツは上書きされます。したがって、更新されたフィールドがnullの場合は、新しいコンテンツを追加します。すでにコンテンツがある場合は変更せずに次のフィールドに移動します。私はSQLiteで使用できるIFNULLについて読んでいますが、私は自分のPDO準備文の中でどのように使用しているのか分かりません。そのはすでに何かを得た場合

すべてのヘルプ、指導、例がいただければ幸いです:) SQLiteの

答えて

0

とPHP5を使用して

PSイムをフィールドがnullのアップデートの場合は、その後、新しいコンテンツを追加変更されずに次のフィールドに移動します。

これを行うには​​3210を使用できます。ここでの例です:

~ e$ sqlite3 
SQLite version 3.7.5 
Enter ".help" for instructions 
Enter SQL statements terminated with a ";" 
sqlite> create table foo (a,b,c); 
sqlite> insert into foo values (1,NULL,3); 
sqlite> select * from foo; 
1||3 
sqlite> update foo set a = a + 1, b = coalesce(b,'b'), c = coalesce(c,'c'); 
sqlite> select * from foo; 
2|b|3 
sqlite> 

だから、あなたのstmt1は次のようになります。

$stmt1 = $db->prepare("UPDATE results SET 
    field1=coalesce(field1,?), field2=coalesce(field2,?), field3=coalesce(field3,?) 
    WHERE id=? 
"); 
+0

私が合体してみましたが、私はエラーを得ていました!しかし、あなたの例から、私はそれが間違っているのを見る!この例に感謝します。完全に働いた:) – fl3x7

関連する問題