您有一个table1
包含id
列的表,即int(11), not null, auto_increment
从 1 开始。
假设您有 10,000 条记录。很明显,最后一条记录的 id 是 10,000。删除 3 条记录后,表中有 9,997 条记录,但最后一条记录 id 值仍为 10,000(如果最后一条记录没有删除)。
如何使用 1 个 sql 查询显示已删除的记录?
谢谢你。
您有一个table1
包含id
列的表,即int(11), not null, auto_increment
从 1 开始。
假设您有 10,000 条记录。很明显,最后一条记录的 id 是 10,000。删除 3 条记录后,表中有 9,997 条记录,但最后一条记录 id 值仍为 10,000(如果最后一条记录没有删除)。
如何使用 1 个 sql 查询显示已删除的记录?
谢谢你。
我认为最简单的方法是拥有一个只有 id 的虚拟/临时表。1-1000 然后左连接到该表。
但是,一旦完成,请务必从您的虚拟/临时表中删除“已删除”的记录。否则,他们每次都会出现。
>> 编辑 << 您可以自行加入以确定您是否缺少 ids....
select a.id + 1 MissingIds
from <table> a
left join <table> b
on a.id = b.id - 1
where b.id is null
and a.id < 10000
我用这个答案作为参考。
您可以使用以下查询来查找差距,这实质上将为您提供已删除的记录“范围”。例如,在下面的示例中,您在最终结果中返回 2 行,其值为 2 和 3,以及 6 和 7。因此您知道 ID 为 2 到 3 的行已被删除,并且 ID 为6 到 7 行已被删除(总共 4 行已删除)。
我相信这满足了您在“1 SQL 查询”中获得最终结果的要求,并且不使用中间表或虚拟表。
delimiter $$
use test
$$
create table mytable (id int not null auto_increment, name varchar(100), primary key (id));
$$
insert into mytable (name) values('a')$$
insert into mytable (name) values('b')$$
insert into mytable (name) values('c')$$
insert into mytable (name) values('d')$$
insert into mytable (name) values('e')$$
insert into mytable (name) values('f')$$
insert into mytable (name) values('g')$$
insert into mytable (name) values('h')$$
delete from mytable where id = 2$$
delete from mytable where id = 3$$
delete from mytable where id = 6$$
delete from mytable where id = 7$$
SELECT (t1.id + 1) as gap_starts_at
, (SELECT MIN(t3.id) -1
FROM mytable t3
WHERE t3.id > t1.id) as gap_ends_at
FROM mytable t1
WHERE NOT EXISTS (SELECT t2.id FROM mytable t2 WHERE t2.id = t1.id + 1)
HAVING gap_ends_at IS NOT NULL
输出:
gap_starts_at gap_ends_at
2 3
6 7
DECLARE @myTestTable1 TABLE
(
id INT IDENTITY(1,1) NOT NULL
,testVal int
)
DECLARE @increment AS int = 1
WHILE (@increment <= 10000)
BEGIN
INSERT INTO @myTestTable1
VALUES (@increment)
SET @increment += 1
END
DELETE FROM @myTestTable1 WHERE id IN (100,200,300)
--SELECT * FROM @myTestTable1
;WITH Missing (missnum, maxid)
AS
(
SELECT 1 AS missnum, (select max(id) from @myTestTable1)
UNION ALL
SELECT missnum + 1, maxid FROM Missing
WHERE missnum < maxid
)
SELECT missnum
FROM Missing
LEFT OUTER JOIN @myTestTable1 tt on tt.id = Missing.missnum
WHERE tt.id is NULL
OPTION (MAXRECURSION 0);
但这需要很多时间。我们必须减少时间。