php - MySQL更新查询,如何跳过空值?

标签 php mysql

我有这样的查询:

$sql = "UPDATE test_accs SET 
    acc_owner = '$owner_id', 
    acc_policy_version = '$version', 
    acc_policy_last_update = '$approved', 
    acc_policy_next_update = '$renewed' 
        WHERE acc_id = '1'";

现在,网络上的所有这些值都是可选的,可以设置这些值中的一个,两个左右。现在,在我提交表单后,它会像这样进入查询:

UPDATE test_accs SET acc_owner = '2', acc_policy_version = '1.2', acc_policy_last_update = '2012-12-19', acc_policy_next_update = '2012-12-18' WHERE acc_id = '1'

只有当我提交表单中的所有值时它才有效。您能告诉我即使没有发送所有值(例如其中一个值)它如何工作吗?

当我设置一个值(例如政策版本)时,它看起来像这样:

UPDATE test_accs SET acc_owner = '', acc_policy_version = '1.2', acc_policy_last_update = '', acc_policy_next_update = '' WHERE acc_id = '1'

它不起作用。

这可能是 acc_owner 表值的可能原因?

#1366 - Incorrect integer value: '' for column 'acc_owner' at row 1

谢谢你的建议。

表格:

echo '<td>Change owner: <select name="owner_id" onchange="showUser(this.value)" style="font-size:9px"><option value="">Select a person:</option>';
    while($owners = mysql_fetch_array($owners_query)) { echo '<option value="'.$owners['id'].'">'.$owners['surname'].' '.$owners['name'].'</option></h2>'; } echo '</select></td>';
    echo "<td><input name='version' style='width:50px;text-align:center' placeholder='0.0' /></td>";
    echo "<td><input name='approved' class='datepicker_all' readonly='readonly' style='text-align:center' placeholder='1999-01-01' /></td>";
    echo "<td><input name='renewed' class='datepicker_all' readonly='readonly' style='text-align:center' placeholder='1999-01-01' /></td>";

最佳答案

完成此操作的一种方法是在 SQL 语句中使用表达式来测试提供的值是否为空字符串。如果提供的值为空字符串,则使用列的当前值作为分配给该列的值。否则,将提供的值分配给该列。

在下面的示例中,每个提供的值都必须在语句中包含两次:一次在条件测试中,然后再次作为条件测试的可能结果。

这个声明:

UPDATE test_accs
   SET acc_owner              = IF('2'='',acc_owner,'2')
     , acc_policy_version     = IF('1.2'='',acc_policy_version,'1.2')
     , acc_policy_last_update = IF('2012-12-19'='',acc_policy_last_update,'2012-12-19')
     , acc_policy_next_update = IF('2012-12-18'='',acc_policy_next_update,'2012-12-18')
 WHERE acc_id = '1'

等同于问题中的第一个 UPDATE 语句,因为它将所有四列的值设置为新的指定值。

这个声明:

UPDATE test_accs
   SET acc_owner              = IF(''='',acc_owner,'')
     , acc_policy_version     = IF('1.2'='',acc_policy_version,'1.2')
     , acc_policy_last_update = IF(''='',acc_policy_last_update,'')
     , acc_policy_next_update = IF(''='',acc_policy_next_update,'')
 WHERE acc_id = '1'

仅更改 acc_policy_version 列的值,其他三列的值将保持不变。

这不一定是最好的方法,但在某些情况下是可行的。

也可以创建一个表达式,要求在语句中一次指定每个提供的值,尽管我认为这些表达式不太直观:

   SET acc_owner          = COALESCE(NULLIF( ''     ,''),acc_owner         )
     , acc_policy_version = COALESCE(NULLIF( '1.2'  ,''),acc_policy_version)

这基本上与上面的示例执行相同的操作。

如果提供的值等于 ''(如上例中的 acc_owner),则 NULLIF 表达式将返回 NULL。 COALESCE 函数实质上会导致跳过该 NULL 值,并且列的当前值将保持不变(列的当前值分配给该列。)

如果提供的值不等于 ''(如上例中的 acc_policy_version),则 NULLIF 表达式将返回提供的值。 COALESCE 函数将选取该值,并将其分配给该列。

关于php - MySQL更新查询,如何跳过空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13844701/

相关文章:

mysql - 在 MySQL 的选择查询中使用 CASE、WHEN、THEN、END

php - 将上传图像的路径保存在数据库中

mysql - 在我的 Web 应用程序中获取主键列显示为 null 的结果,但在 SQL Workbench 中相同的 SELECT 语句工作正常

PHP 如何打开浏览器错误日志记录

php - 解析错误 : syntax error, 意外 '[',期待 ')'

php - where 子句中的列 'id_f' 不明确

mysql - 当结果仅包含属性有效的开始日期时,如何在两个日期之间进行 MySQL 查询?

PhpStorm、UML 图和 xmi 文件

php - 如何在 PHP 中将一个整数除以多个值?

mysql - 满足3NF的数据库设计