2011-12-28 78 views
3

我有一個「口」 INT列,其中它應該從30000至50000檢測在(自動遞增)序列

因此缺失值,我有一個存儲過程中插入值(端口不空值)。所以我必須選擇「手動」存儲在該字段上的值。問題是,儘管我可以在某個點上增量插入(30000,30001,30002 ....),但有些條目會被刪除(它變成了30000,30002,30004 ....),所以有些孔要設置。

我需要在我的SP中放置一個適合這些洞的方法(在我的例子中它們是30001,30003 ....)。我的問題是如何檢查SP,如果某個值已經'ocuppied'。

我以爲從MySQL使用LOOP。嘗試這樣的事情:

CREATE PROCEDURE teste() 
BEGIN 
DECLARE p INT; 
DECLARE aux INT; 
SET p = 30000; 

    label1: LOOP 

    SELECT Port FROM Reg WHERE Port = p INTO aux; 

    IF p = 50000 THEN 
    LEAVE label1; 
    END IF; 


    IF aux IS NULL THEN -- aux-1 is not null, so I can verify the "next miminum available position" 
     aux = aux - 1; 
     LEAVE label1; 

    ELSE 
     SET p = p + 1; 
     ITERATE label1; 


    END IF; 

    END LOOP label1; 

RETURN aux; 

END $$ 

我的問題是獲取結果值。如果我放置該RETURN語句,則只會獲得FUNCTION上允許的信息。當我結束循環時,SELECT的結果總是爲空。

我該怎麼辦?

+1

所以,問題是:我怎麼發現從序列缺失值? – 2011-12-28 18:27:52

+0

@SergeiTulentsev是的!我需要最小的缺失值,所以我可以將它用於下一個條目。 – Tiago 2011-12-28 18:39:01

+0

看看我的答案。 – 2011-12-28 18:39:44

回答

2
SELECT IFNULL(MIN(r1.Port) + 1, 30000) as minport 
FROM Reg r1 
LEFT JOIN Reg r2 ON r1.Port + 1 = r2.Port 
WHERE r2.Port IS NULL: 
+0

完美!非常感謝你。 – Tiago 2011-12-29 17:12:20

0

只需插入IGNORE從30000到50000的所有值(假設你在場上有一個唯一的鍵)。沒有什麼比檢測數據庫本身更快,是否存在或不存在價值。

5

下面介紹如何在序列中找到缺失值。

SELECT a.id+1 AS start, MIN(b.id) - 1 AS end 
    FROM seq AS a, seq AS b 
    WHERE a.id < b.id 
    GROUP BY a.id 
    HAVING start < MIN(b.id) 

輸出示例:

+-------+------+ 
    | start | end | 
    +-------+------+ 
    |  4 | 4 | 
    |  7 | 9 | 
    +-------+------+ 

這意味着,在序列id值4是缺少,並且也從7至9(包含地)數字。

通過替換相應的名稱來適應您的需求。

1

你能做這樣的事嗎?

SELECT 
    MIN(Port + 1) 
FROM 
    Reg 
WHERE 
    Port + 1 NOT IN (
     SELECT Port FROM Reg WHERE Port > 0 
    ) 
ORDER BY 
    Port ASC 
+0

是的,這也可以;) – Tiago 2011-12-29 17:09:15