0

さて、最近SQLiteを読んで作業しています(ここの誰かが実際にそれを提案しました)。

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

今私が試した最初の方法は、idを主キーとして設定し、INSERTORREPLACEをに設定することでした。これに関する問題は、以前のコンテンツが消去されていたことでした。

したがって、現在行っているのは更新クエリです。変更された行数をチェックしています。1未満の場合は、挿入クエリを実行します(これには余分なオーバーヘッドがあることがわかっているので、共有するより良い方法がある場合)。

とにかく私の問題は(最後に)..更新クエリを使用しても、レコードがnull値で上書きされていることです。

以下のコードスニペットを要約しました。

    $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プリペアドステートメント内でそれをどのように使用するかわかりません。

ヘルプ、ガイダンス、例をいただければ幸いです:)

psImはSQLiteでPHP5を使用しています

4

1 に答える 1

0

更新時にフィールドがnullの場合は、新しいコンテンツを追加します。すでに何かが含まれている場合は、変更せずに次のフィールドに移動します。

これを行うために使用できますcoalesce。ここに例があります:

~ 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=?
");
于 2011-02-05T04:35:34.730 に答える