MYSQL服务器-仅更新值(如果不为null)

时间:2018-10-09 18:23:41

标签: mysql database url

我只想更新一个不为null或为空字符串的值,但是我尝试了从intfloat的所有内容。

我对想法完全迷失了,我一直在浏览互联网以寻求解决方案,但是找不到适合我的东西。

COALESCE(new_value, old_value)

我希望上面的查询仅在用户在表单中键入值时更新每个值,如果表单为空,则应仅使用旧值。

3 个答案:

答案 0 :(得分:1)

如果按假定使用mysql COALESCE函数,则可以执行此操作。另外,nullif是必需的,但您使用错了。

使用php生成此代码时,必须考虑与null值相比,如何处理字符串值(字符串值需要用引号引起来,而NULL则不需要):

$query = "UPDATE Person SET fornavn=COALESCE('$escapedFornavn',fornavn)"
如果$esapedFornavn是有效的字符串,

将按预期工作。但是,如果$esapedFornavn==null查询看起来像第一个查询,而您想要第二个查询...

UPDATE Person SET fornavn=COALESCE('',fornavn);
UPDATE Person SET fornavn=COALESCE(null,fornavn);

因此,要实现所需的条件,可以使用nullif将空字符串转换为真实的nulls

UPDATE Person SET fornavn=COALESCE(nullif('$escapedFornavn', ''),fornavn)

基本测试:

SELECT COALESCE(nullif(null,''),"oldvalue") -- will return "oldvalue", so no update.
SELECT COALESCE(nullif("newvalue",''),"oldvalue") -- will return "newvalue", so the change is persisted.

唯一的缺点:您不能将任何内容设置为空字符串,因为这将保留旧值:

SELECT COALESCE( NULLIF('',  ''), "oldvalue") --returns oldvalue

一种解决方法是改为存储单个空格,并在每次显示时都使用trim()

答案 1 :(得分:0)

根据评论中的建议,在应用程序中进行处理。我希望这个查询会以某种方式有用。

UPDATE Person SET fornavn=IF(fornavn is NULL,NULL,new_value);

答案 2 :(得分:0)

您应该考虑使用UPDATE SELECT将数据放入查询中,然后使用

 SET target.column = IF(source.column is invalid, target.column, source.column)

将列设置为自己时,不会更改它。

这是一个可能的例子。

UPDATE p
   SET p.col1 = IF(q.col1 IS NULL OR LENGTH(q.col1) = 0, p.col1, q.col1),
       p.col1 = IF(q.col2 IS NULL OR LENGTH(q.col2) = 0, p.col2, q.col2),
       p.col1 = IF(q.col3 IS NULL OR LENGTH(q.col3) = 0, p.col3, q.col3),
               ...
 FROM Person AS p
 JOIN (
       SELECT 
           <<<value1>> col1,
           <<<value2>> col2,
           <<<value3>> col3,
               ...
      ) AS q
WHERE <<<whatever condition>>>