2009-07-22 4 views
0

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

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

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

Большое значение.

ответ

2

Выберите, это зависит от вашего запроса на обновление. Если таблица имеет поля с именем: some_id, Foo, бар, Баз, QUX - и у вас есть UPDATE в вашем 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) и ВСТАВИТЬ Ignore (http://dev.mysql.com/doc/refman/5.1/en/insert.html) запросы. Они могут быть более подходящими для того, что вы делаете.

0

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

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

Лучше проверять данные первого.

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

Вы можете использовать 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 
Смежные вопросы