Sql Postgres在列中递增null值

Sql Postgres在列中递增null值,sql,postgresql,null,postgresql-9.3,Sql,Postgresql,Null,Postgresql 9.3,在Postgres 9.3中,当表中的字段具有空值时,以下表达式不起作用: update table_statatistic set members = members + 1 WHERE user_id = $1; 但是,当字段具有整数值时,此查询会将其递增1,而不会出现问题 问题是: 为什么会发生这种情况 如何修复它 您需要使用coalesce检查空值 update table_statatistic set members = coalesce(members, 0) + 1 WHER

在Postgres 9.3中,当表中的字段具有空值时,以下表达式不起作用:

update table_statatistic set members = members + 1 WHERE user_id = $1; 
但是,当字段具有整数值时,此查询会将其递增1,而不会出现问题

问题是:

  • 为什么会发生这种情况
  • 如何修复它

  • 您需要使用coalesce检查空值

    update table_statatistic set members = coalesce(members, 0) + 1 WHERE user_id = $1
    
    改用
    COALESCE()
    COALESCE
    函数返回其第一个非空参数。仅当所有参数都为Null时,才会返回Null。在检索数据以显示时,它通常用于将默认值替换为空值

    UPDATE table_statatistic SET members = COALESCE(members,0) + 1 WHERE user_id = $1; 
    

    为什么我需要使用coalesce。无+1=1。为什么会发生这种情况。具有空值的字段是没有值的字段。所以你不能在没有值的情况下添加1。Null不是一个值。这是违反直觉的,没有逻辑意义,Null意味着什么。在许多编程语言中,您可以将整数添加到null中。您能告诉我编程语言的名称吗?@Jimski
    null
    不是
    0
    这是两件截然不同的事情
    null
    表示没有任何信息。如果我让你在太空船上加一把椅子怎么办。在那之后你的宇宙飞船会有多少把椅子?为什么?因为每个涉及
    null
    的表达式都会产生
    null
    。SQL就是这样指定的。我认为您有这个问题,因为您滥用SQL NULL。正确的语义为“未知”,但您希望将其视为0。也许您应该在列定义中添加一个默认的0子句(并在执行此操作时添加一个NOTNULL)。这不仅可以解决您的问题,还可以简化所有查询。