2011-02-04 2 views
0

좋습니다. 최근에 SQLite를 읽고 이에 대해 실습 해 보았습니다.SQLite 업데이트가 필드를 null 값으로 바꾸고 있습니다.

필자가 필요로하는 것은 메모리 내 데이터베이스입니다. 그러나 내가 가지고있는 문제는 그들의 레코드가 여기에 있으므로 레코드를 삽입하고 싶었지만 이미 존재한다면 누락 된 필드를 채우는 것입니다.

이제 첫 번째 방법은 id를 기본 키로 설정하고 INSERT OR REPLACE를 설정하는 것입니다. 이 문제는 이전 내용이 지워지는 것이 었습니다.

그래서 지금 내가 뭘하는지는 업데이트 쿼리입니다. 나는 행 수가 바뀌는 지 확인했다. 그것의 1보다 낮은 경우 삽입 쿼리를 실행합니다 (만약 이것이 더 좋은 방법으로 공유한다면 여분의 오버 헤드가 있음을 알 수 있습니다).

어쨌든 내 문제 (마침내) .. 업데이트 쿼리를 사용하더라도 레코드가 null 값으로 덮어 쓰여지고 있습니다.

필자는 아래의 코드 단편 응축 :

위가 foreach 루프 내에 일어나고
$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']));  
    } 

.

어쨌든 이미 db에있는 경우 내용을 덮어 쓰지 않도록합니다. 따라서 업데이트에서 필드가 null 인 경우 새로운 내용을 추가합니다. 이미 내용이있는 경우 변경하지 않고 다음 필드로 이동합니다. 필자는 SQLite에서 사용할 수있는 IFNULL에 대해 읽었지 만, 필자의 PDO 준비된 명령문 내에서 어떻게 사용하는지 모르겠습니다.

SQLite는에 어떤 도움, 지침은, 예 주시면 감사하겠습니다 :)

PS 임 사용 PHP5

답변

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=? 
"); 
+0

나는 유착을 시도했지만 나는 점점 오류가 있었다! 그러나 당신의보기에서 나는 그것을 잘못하고있는 것을 본다 !!! 예를 들어 주셔서 감사합니다. 완벽하게 일했습니다 :) – fl3x7

관련 문제