如何仅更新表中的非空值?

时间:2017-04-05 15:25:28

标签: php mysql sql-update

如何仅更新非空值?

我有一个用于更新结果集的SQL代码。

但是在我提交表单后,我没有输入的值也会被更新并在数据库中记录为空值。

这是我的代码

$insert = "UPDATE result SET test_1= '$test_1', test_2= '$test_2', 
                 test_3= '$test_3', test_4= '$test_4', 
                 test_5 = '$test_5' 
                WHERE roll_no = '$roll_no'";

表格

 <form action="#" method="post">
 <input type="text" name="test_1" required="" class="" >
 <input type="text" name="test_2" required="" class="" >
 <input type="text" name="test_3" required="" class="" >
 <input type="text" name="test_4" required="" class="" >
 <input type="text" name="test_5" required="" class="" >
 <button type="submit" class="" name="sub">SUBMIT</button>

如果我只填写 test_1 test_2 ,我希望其他列不受影响,因为没有输入。

3 个答案:

答案 0 :(得分:0)

如果您想坚持自己发布的查询,那么COALESCE可以在这种情况下为您提供帮助。

UPDATE result
SET test_1 = COALESCE('$test_1', test_1), test_2 = COALESCE('$test_2', test_2),
  test_3   = COALESCE('$test_3', test_3), test_4 = COALESCE( '$test_4', test_4),
  test_5   = COALESCE('$test_5', test_5)
WHERE roll_no = '$roll_no';

MySQL COALESCE()函数返回列表的第一个非NULL值,如果没有非NULL值,则返回NULL。

示例: MySQL COALESCE()函数

mysql> SELECT COALESCE(NULL, 2, 3);
+----------------------+
| COALESCE(NULL, 2, 3) |
+----------------------+
|                    2 |
+----------------------+
1 row in set (0.02 sec)
mysql> SELECT COALESCE(NULL, NULL, NULL);
+----------------------------+
| COALESCE(NULL, NULL, NULL) |
+----------------------------+
|                       NULL |
+----------------------------+
1 row in set (0.00 sec)

注意:只有空值实际为NULL时才会有效。 NULL <> Empty

答案 1 :(得分:0)

首先,您需要一种方法来确定是否存在&#34;没有输入&#34;对于给定的表单字段。我们假设将提供表单字段,并且该值将为零长度字符串。

也就是说,我们可以对分配给变量的值(例如$ test_4`)进行条件测试,以确定这是否是我们要存储的值,或者它是否&#34;没有输入& #34;,我们要忽略它。

在SQL中,可以评估表达式并返回值。例如,ANSI标准:

 CASE WHEN foo = '' THEN bar ELSE foo END 

或特定于MySQL的简写:

 IF(foo = '',bar,foo)

在UPDATE语句中,可以引用列的当前值,我们可以在表达式中返回...

UPDATE mytable t
   SET t.col = IF(foo='',t.col,foo) 
 WHERE ...

如果foo等于零长度字符串,则表达式返回列的当前值。这将被分配回同一列,导致&#34;没有更新&#34;列值。 (请注意,如果在表上定义了更新&#34;触发器之前的触发器,触发器将被触发,这可能会修改NEW.col的值。)

假设已正确转义值$test_4以缓解潜在的SQL注入漏洞,并且由于某些原因我们无法使用带有绑定占位符的预准备语句...

假设我们要让$test_4中存储的零长度字符串代表&#34;没有输入&#34;

我们可以这样做:

UPDATE result r 
   SET ...
     , r.test_4   = IF('$test_4' = '', r.test_4, '$test_4')
 WHERE ...

表达

的ANSI标准方式越多
UPDATE result r 
   SET ...
     , r.test_4   = CASE WHEN '$test_4' = '' THEN r.test_4 ELSE '$test_4' END
 WHERE ...

答案 2 :(得分:-1)

尝试ifnull函数,如下所示:

UPDATE result 
SET test_1 = ifnull(test_1,'$test_1'), 
    test_2 = ifnull(test_2,'$test_2'), 
    test_3 = ifnull(test_3,'$test_3'), 
    test_4 = ifnull(test_4,'$test_4'), 
    test_5 = ifnull(test_5,'$test_5') 
WHERE roll_no = '$roll_no'