从自动增量主键获取已删除主键的列表

时间:2013-10-25 12:44:59

标签: mysql gaps-and-islands

我有一个表,其中id是设置了自动增量的主键列。它包含超过10,00行。

我需要获取已删除的所有主键。 喜欢

1 xcgh fct

2 xxml fcy

5 ccvb fcc

6 tylu cvn

9 vvbh cvv

我应该得到的结果是

3

4

7

8

目前我统计所有记录,然后在另一个表中插入(1到count),然后我从记录表中存在的该表中选择id。但这种方法效率很低。我可以使用任何直接查询吗? 请指定mysql。

2 个答案:

答案 0 :(得分:0)

见小提琴: http://sqlfiddle.com/#!2/edf67/4/0

CREATE TABLE SomeTable (
  id     INT  PRIMARY KEY
, mVal  VARCHAR(32)
);

INSERT INTO SomeTable
VALUES (1, 'xcgh fct'), 
       (2, 'xxml fcy'), 
       (5, 'ccvb fcc'), 
       (6, 'tylu cvn'), 
       (9, 'vvbh cvv');

set @rank = (Select max(ID)+1 from sometable);

create table CompleteIDs as (Select @rank :=@rank-1 as Rank
                             from sometable st1, sometable st2
                             where @rank >1);


SELECT   CompleteIDs.Rank 
FROM CompleteIDs
LEFT JOIN someTable S1 
  on CompleteIDs.Rank = S1.ID
WHERE S1.ID is null
order by CompleteIDs.rank

这里有一个假设。 someTable中的记录数* sometable中的记录数大于sometable中的最大ID。否则这不起作用。

答案 1 :(得分:0)

您可以尝试创建临时表,例如填写表格1,000个值,你可以使用任何脚本语言或尝试一个程序(这可能是无效的整体)

DELIMITER $$
CREATE PROCEDURE InsertRand(IN NumRows INT)
BEGIN
    DECLARE i INT;
    SET i = 1;
    START TRANSACTION;
    WHILE i <= NumRows DO
        INSERT INTO rand VALUES (i);
        SET i = i + 1;
    END WHILE;
    COMMIT;
END$$
DELIMITER ;

CALL InsertRand(5);

然后你只需要查询

SELECT id AS deleted_id FROM temporary_table
WHERE id NOT IN
    (SELECT id FROM main_table)

请注意,它应该像每天的动作或某些因素导致内存效率低下