从自动递增主键中列出缺少的ID

时间:2014-10-08 07:56:13

标签: sql-server tsql

我有一个表具有主键user_id的用户当我们插入user_details时会自动递增。现在我需要列出所有丢失(或删除)的user_id 。 我已经这样试过了。

DECLARE @NUMBER BIGINT = (SELECT MIN(USER_ID) FROM USERS)

DECLARE @MAX BIGINT = (SELECT MAX(USER_ID) FROM USERS)

CREATE TABLE TEMP_USERS (USER_ID BIGINT)

WHILE @NUMBER <= @MAX
BEGIN
    INSERT INTO TEMP_USERS
        VALUES(@NUMBER);

    SET @NUMBER = @NUMBER+1;
END

SELECT USER_ID from TEMP_USERS 
EXCEPT 
SELECT USER_ID from USERS

但它花了太长时间。 是否有其他方法可以提高性能?

谢谢, 维杰

1 个答案:

答案 0 :(得分:2)

如果您使用的是MSSQL 2005+。然后你可以这样做:

DECLARE @NUMBER  BIGINT =(SELECT MIN(USER_ID) from USERS)
DECLARE @MAX BIGINT =(SELECT MAX(USER_ID) from USERS)

;WITH Nbrs ( n ) AS (
        SELECT @NUMBER UNION ALL
        SELECT 1 + n FROM Nbrs WHERE n < @MAX)
SELECT
    Nbrs.n AS USERID
FROM
    Nbrs
WHERE NOT EXISTS
(
    SELECT NULL FROM USERS
    WHERE USERS.USER_ID=Nbrs.n
)
OPTION ( MAXRECURSION 0 )

<强>更新

解决评论。在这种情况下MAXRECURSION做了什么。当我们使用递归CTE函数时,有可能以一种永不结束的方式编写它。服务器MAXRECURSION为100.可以通过使用不应该使用服务器MAXRECURSION的提示来覆盖它。

当我们使用0时,它没有任何MAXRECURSION。如果我们不设置MAXRECURSION然后在100行之后它将崩溃并抛出MAXRECURSION已满足的异常。

因为我们可以预期OP在序列中有更多缺少的用户ID,我们需要指出我们要继续进行递归,直到n < @MAX