Mysql Update или Insert с пустыми значениями - PullRequest
0 голосов
/ 22 июля 2009

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

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

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

Очень ценится.

Ответы [ 4 ]

2 голосов
/ 22 июля 2009

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) и INSERT IGNORE (http://dev.mysql.com/doc/refman/5.1/en/insert.html), а также запросы. Они * 1013) * может быть более подходящим для того, что вы делаете.

0 голосов
/ 22 июля 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 
0 голосов
/ 22 июля 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);
}
0 голосов
/ 22 июля 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...