我有一个表,其中 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指定。
我有一个表,其中 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指定。
见小提琴: 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,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)
请注意,它应该像每天的动作或某事导致它的内存效率非常低