好的,所以我最近一直在阅读和使用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预处理语句中使用它。
任何帮助,指导,例子将不胜感激:)
p.s Im使用PHP5和SQLite
答案 0 :(得分: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=?
");