Обновление SQLite заменяет поля пустыми значениями - PullRequest
0 голосов
/ 05 февраля 2011

Хорошо, я недавно читал и работал с SQLite (кто-то здесь предлагал это на самом деле).

Он прекрасно работает для того, что мне нужно - базы данных в памяти.Однако проблема, с которой я столкнулся, состоит в том, что они являются дублирующими записями, поэтому я хотел вставить запись, но если она уже существует, просто заполните пропущенные поля.

Теперь первый метод, который я попробовал, былустановка идентификатора в качестве первичного ключа и вставка или замена в.Проблема с этим заключалась в том, что предыдущее содержимое было уничтожено.

Итак, что я сейчас делаю, так это запрос на обновление.Я их проверяю, сколько строк изменилось.если его значение меньше 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.

Является ли их в любом случаеостановите перезаписывание контента, если он уже есть в БД.Поэтому, если в обновлении поле пустое, добавьте новый контент, если в нем уже есть что-то, оставьте его без изменений и перейдите к следующему полю.Я читал о IFNULL, который можно использовать в SQLite, но я не уверен, как я использую это в своих подготовленных PDO инструкциях.

Буду признателен за любую помощь, руководство, примеры:)

ps Я использую PHP5 с SQLite

1 Ответ

0 голосов
/ 05 февраля 2011

если в обновлении поле пустое, добавьте новое содержимое, если в нем уже есть что-то, оставьте его без изменений и перейдите к следующему полю.

Вы можете использовать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=?
");
...