我在PostgreSQL中有一个包含2个字段的用户表:
ID(int)||姓名(文字)
当我向表中插入新用户时,表应将其ID设置为ID列表中的下一个索引,即列表中的ID是:1,2,3 将添加的下一个用户将被分配ID = 4.
要做到这一点,我在表中获取最大ID值并递增它,问题是如果表为空,MAX函数返回null,以便处理 - 我决定使用COALESCE如下:
INSERT INTO users VALUES COALESCE(0,(SELECT MAX(id) FROM users) + 1), 'Smith');
如果从MAX函数返回NULL值,则意图放0。
问题是当SELECT MAX(id) FROM USERS
确实返回NULL值时,当我添加+1
时会出现错误。
如何修复?我打算将其保留在一个查询中。
答案 0 :(得分:4)
值是向后的(the reply address mismatch
中缺少括号。我认为编写此类查询的一种更简单的方法是使用VALUES()
:
insert . . . select
注意:您应该在插入时列出所有列。当您使用SQL时,它将防止难以发现的错误。
但是,正确的方法是将INSERT INTO users(id, Name)
SELECT COALESCE(MAX(id) + 1, 0), 'Smith'
FROM users;
定义为id
,其中描述了here。然后,数据库维护id列。
答案 1 :(得分:0)
交换外观顺序;
INSERT INTO users VALUES (COALESCE(SELECT MAX(id) FROM users, -1) + 1), 'Smith');