Обновление или вставка Mysql с пустыми значениями

Быстрый вопрос.

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

Мой вопрос: если входящая запись имеет пустые поля, но данные, уже находящиеся в базе данных, не пусты, перезаписывает ли команда обновления существующие данные пустыми значениями?

Очень признателен.


person Choog    schedule 22.07.2009    source источник


Ответы (4)


Choog, это зависит от вашего запроса на обновление. Если в вашей таблице есть поля с именами: some_id, foo, bar, baz, qux - и у вас есть ОБНОВЛЕНИЕ в вашем PHP-скрипте, например:

"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) и ВСТАВИТЬ ИГНОРИРОВАТЬ (http://dev.mysql.com/doc/refman/5.1/en/insert.html) запрашивает как Что ж. Они могут больше подходить для того, чем вы занимаетесь.

person hobodave    schedule 22.07.2009

Обновление будет перезаписано, если это простое обновление MySQL.

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

Сначала лучше проверить данные.

person Extrakun    schedule 22.07.2009

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


$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);
}
person rezzif    schedule 22.07.2009

Вы можете использовать INSERT... ON DUPLICATE.
И 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 
person VolkerK    schedule 22.07.2009