1

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

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

1 xcgh fct

2 xxml fcy

5 ccvb fcc

6 tylu cvn

9 vvbh cvv

我应该得到的结果是

3

4

7

8

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

4

2 回答 2

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。否则这是行不通的。

于 2013-10-25T14:19:48.620 回答
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)

请注意,它应该像每天的动作或某事导致它的内存效率非常低

于 2013-10-25T19:58:12.870 回答