处理NULL+1的SQL合并
我在PostgreSQL中有一个包含2个字段的用户表: ID int | |名称文本 当我向表中插入新用户时,表应该将他的ID设置为ID列表中的下一个索引,即如果列表中的ID是:1、2、3 将添加的下一个用户将被分配ID=4 为此,我在表中获取max ID值并递增,问题是如果表为空,max函数返回null,为了处理这个问题,我决定使用COALESCE,如下所示:处理NULL+1的SQL合并,sql,postgresql,Sql,Postgresql,我在PostgreSQL中有一个包含2个字段的用户表: ID int | |名称文本 当我向表中插入新用户时,表应该将他的ID设置为ID列表中的下一个索引,即如果列表中的ID是:1、2、3 将添加的下一个用户将被分配ID=4 为此,我在表中获取max ID值并递增,问题是如果表为空,max函数返回null,为了处理这个问题,我决定使用COALESCE,如下所示: INSERT INTO users VALUES COALESCE(0,(SELECT MAX(id) FROM users) + 1
INSERT INTO users VALUES COALESCE(0,(SELECT MAX(id) FROM users) + 1), 'Smith');
在MAX函数返回空值的情况下,该函数将设置为0
问题是,虽然SELECT MAXid FROM USERS返回空值,但当我添加+1时,它会给出一个错误
这怎么能解决呢?我打算将其保存在一个查询中。这些值是向后的,并且在值中缺少括号。我认为编写这样一个查询的简单方法是使用insert。选择: 注意:执行插入操作时,应列出所有列。它将防止在使用SQL时难以发现错误
然而,正确的方法是将id定义为serial,如下所述。然后,数据库维护id列。值是向后的,并且值中缺少括号。我认为编写这样一个查询的简单方法是使用insert。选择: 注意:执行插入操作时,应列出所有列。它将防止在使用SQL时难以发现错误
然而,正确的方法是将id定义为serial,如下所述。然后,数据库维护id列。交换外观顺序
INSERT INTO users VALUES (COALESCE(SELECT MAX(id) FROM users, -1) + 1), 'Smith');
交换出场顺序
INSERT INTO users VALUES (COALESCE(SELECT MAX(id) FROM users, -1) + 1), 'Smith');
它是从用户中选择MAXid,如果表为空,0+1不是会放1吗?我希望ID从0开始。请检查@gordon的答案。@jarlh mysql标记是因为COALESCE可以在mysql中使用,我假设了解mysql查询的人可以提供帮助,以及正在寻找postgre或mysql帮助的程序员几乎所有dbms都支持COALESCE ANSI SQL函数。。。不要给没有直接参与的产品贴标签!它是从用户中选择MAXid,如果表为空,0+1不是会放1吗?我希望ID从0开始。请检查@gordon的答案。@jarlh mysql标记是因为COALESCE可以在mysql中使用,我假设了解mysql查询的人可以提供帮助,以及正在寻找postgre或mysql帮助的程序员几乎所有dbms都支持COALESCE ANSI SQL函数。。。不要给没有直接参与的产品贴标签!这没有多大帮助,因为我希望ID从0开始。@wannabeprogrammer。我只是看到了那条评论并修复了代码。通常,此类ID从1开始,而不是从0开始;没有特别的原因,但这就是序列、标识、自动增量值和序列在各种数据库中的默认工作方式,所有这些都可以重写为从0.0开始。我的错误是COALESCE函数中参数的顺序?这没有多大帮助,因为我希望ID从0开始。@wannabeprogrammer。我只是看到了那条评论并修复了代码。通常,此类ID从1开始,而不是从0开始;没有特别的原因,但这就是序列、标识、自动增量值和序列在各种数据库中的默认工作方式,所有这些都可以重写为从0.0开始。我的错误是聚合函数中参数的顺序?