2015-12-14 28 views
0

我在PostgreSQL中有一個包含2個字段的用戶表:SQL COALESCE處理NULL + 1

ID(int)||名稱(文本)

當我向表格中插入新用戶時,表格應將其ID設置爲ID列表中的下一個索引,即如果列表中的ID是:1,2,3 下一個要添加的用戶將被分配ID = 4.

爲此,我得到表中的最大ID值並遞增,問題是如果表爲空,MAX函數返回空,爲了應對 - 我決定使用COALESCE如下:

INSERT INTO users VALUES COALESCE(0,(SELECT MAX(id) FROM users) + 1), 'Smith'); 

哪些打算把0的情況下,從MAX函數返回NULL值。

問題是,雖然SELECT MAX(id) FROM USERS確實返回NULL值,當我添加+1它會給出錯誤。

這怎麼解決?我有意將它保存在一個查詢中。

+1

這是'COALESCE((SELECT MAX(ID)的使用者),0)+ 1' –

+0

爲什麼MySQL的標籤? – jarlh

+0

在空表的情況下不會放1嗎?我想讓ID從0開始。 –

回答

3

的值是向後(和你在VALUES()缺少括號我覺得寫這樣的查詢的一個簡單的方法是使用insert . . . select

INSERT INTO users(id, Name) 
    SELECT COALESCE(MAX(id) + 1, 0), 'Smith' 
    FROM users; 

注意:您應該列出所有列在做的時候插入,將妨礙難以找到當您使用SQL錯誤。

然而,要做到這一點,正確的方法是通過定義idserial,它們被描述here。然後,數據庫維護id列。

+0

這並沒有多大幫助,因爲我想讓ID從0開始。 –

+0

@wannabeprogrammer。 。 。我剛看到那條評論並修正了代碼。通常,這種ID從1開始而不是從0開始;沒有什麼特別的原因,但是默認情況下,序列,身份,自動遞增值和串行在各種數據庫中是如何工作的(所有這些都可以被重寫以從0開始)。 –

+0

謝謝。我的錯誤是COALESCE函數中參數的順序? –

0

交換外觀順序;

INSERT INTO users VALUES (COALESCE(SELECT MAX(id) FROM users, -1) + 1), 'Smith');