一個簡短的問題。Mysql更新或插入空值
我使用php在數據庫表中插入新記錄 - 如果記錄存在,則運行更新命令。
我的問題是,如果傳入記錄的字段爲空,但數據庫中已存在的數據不爲空,那麼update命令是否用空值覆蓋現有數據?
非常感謝。
一個簡短的問題。Mysql更新或插入空值
我使用php在數據庫表中插入新記錄 - 如果記錄存在,則運行更新命令。
我的問題是,如果傳入記錄的字段爲空,但數據庫中已存在的數據不爲空,那麼update命令是否用空值覆蓋現有數據?
非常感謝。
Choog,這取決於您的更新查詢。如果您的表中有一個名爲字段:SOME_ID,富,酒吧,巴茲,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忽略(http://dev.mysql.com/doc/refman/5.1/en/insert.html)查詢和。他們可能更適合你在做什麼。如果它是一個簡單的MySQL更新
UPDATE table SET field = '$newValue' WHERE id = '$id'
最好是先驗證數據
更新將覆蓋。
如果你只是想更新你可能需要做這樣的事情
$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);
}
您可以使用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