我有一个表,其中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。
答案 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)
请注意,它应该像每天的动作或某些因素导致内存效率低下