Mysql更新或插入空值

时间:2009-07-22 06:05:41

标签: php mysql insert

一个简单的问题。

我正在使用php在数据库表中插入新记录 - 如果记录存在,则运行更新命令。

我的问题是,如果传入记录的字段为空但数据库中的数据不为空,则update命令是否会用空值覆盖现有数据?

非常感谢。

4 个答案:

答案 0 :(得分:2)

Choog,这取决于您的更新查询。如果你的表有以下字段:some_id,foo,bar,baz,qux - 你的PHP脚本中有一个UPDATE,如下所示:

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

这将更新(覆盖)您指定的所有字段。如果这些变量中的任何一个是NULL或空字符串,则是,您将使用NULL(如果允许)或空字符串覆盖现有数据。

如果你只更新你需要的字段,例如foo和bar,那么它不会改变baz和qux的值。 e.g。

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

我不知道您正在做什么的具体细节,但您可能也想查看REPLACE INTO(http://dev.mysql.com/doc/refman/5.1/en/replace.html)和INSERT IGNORE(http://dev.mysql.com/doc/refman/5.1/en/insert.html)查询。他们可能更适合你正在做的事情。

答案 1 :(得分:0)

如果是简单的MySQL更新,则更新将覆盖

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

最好先验证数据。

答案 2 :(得分:0)

如果您只想更新非空的值,可能需要执行类似这样的操作


$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);
}

答案 3 :(得分:0)

您可以使用INSERT ... ON DUPLICATE声明 如果null已作为“新”值传递,则CoALESCE保留旧值。

<?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