2016-03-08 20 views
0

的最低數量,我有這個PostgreSQL表發現在PostgreSQL數據庫列

--------------------------------- 
| id | tag | name | 
--------------------------------- 
| 1 | 1 | name1 | 
| 3 | 3 | name3 | 
| 4 | 4 | name4 | 
| 6 | 6 | name6 | 
| 7 | 7 | name7 | 

此表保持客戶數量:ID是自動遞增的主鍵。標記是一個唯一的整數,它用作在數據庫中查找某個人的簡單方法。由於一些實際問題,人們經常離開該地區並且再也不會來。在任何特定時間,客戶總數不會超過200,但轉換速度相對較快。 由於標籤號碼是在程序中手動輸入的,必須由客戶記憶,因此我想保留標籤號碼非常小,因此當我刪除一個客戶時,我想重新使用其標籤號碼。

在上面的表中,客戶的id#2和5前一段時間被刪除。現在我即將插入一位新客戶,並希望數據庫爲我找到可用的最低標籤號(在這種情況下,它將是#2),以便我可以將其重新用於下一個客戶。

怎麼樣?

Npgsql的最新3.0.5和PostgreSQL 9.5

+0

可能重複:http://stackoverflow.com/questions/174532/how-to-find-holes-in-a-table – jdabrowski

回答

1

隨着ROW_NUMBER(),你應該能夠相當快地做到這一點;

SELECT rn tag             
FROM (SELECT tag, ROW_NUMBER() OVER (ORDER BY tag) rn FROM Table1) z 
WHERE rn != tag                 
ORDER BY rn OFFSET 0 ROW FETCH NEXT 1 ROW ONLY; 

它基本上得到按數字順序標籤,其行號一起,並返回不相關的行標籤匹配第一個行號(即,如果標籤1,2,4存在,他們會得到行編號1,2,3和3是與其標籤不匹配的第一行編號,4)

An SQLfiddle to test with

儘管有一個警告的話,在數據庫中設置標籤是唯一的,並準備重試,如果你有兩個人同時添加客戶,兩個人都會得到最低的標籤,但只有一個會被允許將其設置在他們的客戶。否則,兩個客戶可能會得到相同的標籤,這可能是不好的。

+0

奏效,我不得不改變「OFFSET 0 「到」OFFSET 1「,因爲標籤從0開始,行號從1開始 – docesam

+0

@docesam我認爲'...(ORDER BY標籤) - 1 FROM ...'在這種情況下可能會更好。 –

+0

謝謝。爲什麼這應該會更好? – docesam

1
select tag 
from (
    select generate_series (1, (select max(tag) from customer)) as tag 
    except 
    select tag from customer 
) s 
order by tag 
limit 1 

SQL Fiddle

+0

這也工作。謝謝 – docesam