奇怪的Sql Update行为

时间:2011-03-20 19:34:19

标签: mysql sql postgresql

我正在尝试使用以下更新语句更新PostgreSQL和MySQL上的供应商表:

UPDATE SUPPLIERS SET CURDEBT = CURDEBT + 10 WHERE ID = 5

只要CURDEBT列不等于null,这就可以正常工作,如果它为null,则不会更新记录。有没有人能解决这个问题?

由于

4 个答案:

答案 0 :(得分:6)

使用coalesce

UPDATE SUPPLIERS SET CURDEBT = coalesce(CURDEBT,0) + 10 WHERE ID = 5

请参阅sqlbook

答案 1 :(得分:6)

在SQL中,NULL与0不同。对NULL值的任何操作仍会产生NULL结果。 NULL + 10仍为NULL。

如果您希望NULL在此查询中自动变为“0”,请尝试此操作( PostgreSQL ):

UPDATE SUPPLIERS SET CURDEBT = coalesce(CURDEBT, 0) + 10 WHERE ID = 5

MySQL

UPDATE SUPPLIERS SET CURDEBT = ifnull(CURDEBT, 0) + 10 WHERE ID = 5

答案 2 :(得分:5)

您要找的是COALESCE

UPDATE SUPPLIERS
SET CURDEBT = COALESCE(CURDEBT, 0) + 10
WHERE ID = 5

Coalesce(MySQL):
http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce

答案 3 :(得分:3)

这种行为正是你应该从SQL中得到的,因为null + x = null,总是如此。

您可以使用postgres和mysql中提供的COALESCE函数来解决它,如下所示:

UPDATE SUPPLIERS SET CURDEBT = COALESCE(CURDEBT,0) + 10 WHERE ID = 5