0

好的,所以我最近一直在阅读和使用 SQLite(实际上有人在这里提出了建议)。

它非常适合我需要的东西 - 一个内存数据库。然而,我遇到的问题是它们在这里是重复的记录,所以我想做的是插入记录,但如果它已经存在,那么只需填写缺失的字段。

现在我尝试的第一种方法是将 id 设置为主键并插入或替换。这个问题是以前的内容被清除了。

所以我现在做的是更新查询。我正在检查更改的行数。如果它低于 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 我在 SQLite 中使用 PHP5

4

1 回答 1

0

如果更新时该字段为空,则添加新内容,如果其中已经包含某些内容,则保持不变并继续下一个字段。

您可以使用它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 回答