2011-02-04 40 views
0

好吧,所以我一直在閱讀和使用SQLite最近(這裏有人建議它實際上)。SQLite更新正在替換空值的字段

它非常適合我需要的內存數據庫。然而,我遇到的問題是它們在這裏是重複的記錄,所以我想要做的是插入記錄,但如果它已經存在,那麼只需填寫缺少的字段。

現在我嘗試的第一種方法是將ID設置爲主鍵並將INSERT或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循環內繼續。

他們無論如何都會阻止內容被覆蓋,如果它已經在數據庫中。因此,如果在更新時該字段爲空,則添加新內容,如果它已經有了內容,則保持不變並移至下一個字段。我讀過關於可以在SQLite中使用的IFNULL,但我不知道如何在我的PDO準備語句中使用它。

任何幫助,指導,實例,將不勝感激:)

ps的即時通訊使用PHP5中使用SQLite

回答

0

如果在更新的字段爲空然後添加新的內容,如果其已經得到的東西在它保持不變,並轉向下一個領域。

您可以使用​​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 2011-02-05 13:34:55