2009-07-22 18 views
0

簡単な質問。空の値を持つMySQLの更新または挿入

私はデータベーステーブルに新しいレコードを挿入するためにPHPを使用しています - レコードが存在する場合、代わりに更新コマンドが実行されます。

私の質問は、受信レコードに空のフィールドがありますが、データベースに既に存在するデータが空でない場合、更新コマンドは既存のデータを空の値で上書きしますか?

非常に高く評価されています。

答えて

2

選択すると、更新クエリによって異なります。あなたのテーブルには、名前のフィールドがある場合:some_id、FOO、バー、バズ、quxを - あなたは、このようなようなあなたのPHPスクリプトでUPDATEを持っている:

"UPDATE table SET foo = '$foo', bar = '$bar', baz = '$baz', qux = '$qux' WHERE some_id = '$id'" 

これは(上書き)指定したすべてのフィールドを更新します。これらの変数のいずれかがNULLまたは空の文字列の場合、既存のデータをNULL(許可されている場合)または空の文字列で上書きします。

必要なフィールドだけを更新する、たとえばfooとbarと言うと、bazとquxの値は変更されません。例えば

"UPDATE table SET foo = '$foo', bar = '$bar' WHERE some_id = '$id'" 

私はあなたがやっていることの詳細を知りませんが、あなたはREPLACE INTO(http://dev.mysql.com/doc/refman/5.1/en/replace.html)に見て、IGNORE挿入したいこと(http://dev.mysql.com/doc/refman/5.1/en/insert.html)にも照会します。彼らはかもしれないあなたがやっているものにもっと適しています。それは、単純なMySQLは最初のデータを検証することをお勧めし

UPDATE table SET field = '$newValue' WHERE id = '$id' 

を更新している場合

0

更新が上書きされます。

0

あなただけあなたがINSERT ... ON DUPLICATEステートメントを使用することができ、この


$updates = array(); 
if ($var1 != '') $updates[] = sprintf("`var1` = '%s'", mysql_real_escape_string($var1)); 
if ($var2 != '') $updates[] = sprintf("`var2` = '%s'", mysql_real_escape_string($var2)); 
if (count($updates) > 0) { 
    $query = sprintf("UPDATE table SET %s WHERE id = '%d' ", implode(", ", $updates), $id); 
} 
0

ような何かをしたい場合があり空でない値を更新する場合。
CoALESCEは、nullが "新しい"値として渡された場合に古い値を保持します。

<?php 
$pdo = new PDO('mysql:host=localhost;dbname=test', '...', '...'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

// example table 
$pdo->exec('CREATE TEMPORARY TABLE foo (
    id int auto_increment, 
    x int, 
    y int, 
    z int, 
    primary key(id), 
    unique key(x)) 
'); 

$stmt = $pdo->prepare(" 
    INSERT INTO 
     foo (x,y,z) 
    VALUES 
     (:x,:y,:z) 
    ON DUPLICATE KEY UPDATE 
     y=COALESCE(:y, y), 
     z=COALESCE(:z, z) 
"); 
$stmt->bindParam(':x', $x); 
$stmt->bindParam(':y', $y); 
$stmt->bindParam(':z', $z); 


$x = 1; $y = 1; $z=1; 
$stmt->execute(); 
// duplicate key x=1 
// overwriting y and z 
$x = 1; $y = 2; $z=2; 
$stmt->execute(); 


$x = 2; $y = 20; $z=17; 
$stmt->execute(); 
// duplicate key x=2 
// overwriting only z 
$x = 2; $y = null; $z=21; 
$stmt->execute(); 

unset($stmt); 

foreach($pdo->query('SELECT * FROM foo', PDO::FETCH_NAMED) as $row) { 
    foreach($row as $k=>$v) { 
     echo $k, '=', $v, ' '; 
    } 
    echo "\n"; 
} 

プリント

id=1 x=1 y=2 z=2 
id=2 x=2 y=20 z=21 
関連する問題