SQL查询来获取删除的记录(sql query to get deleted records)

2019-07-30 00:59发布

你有一个表table1包含id列,即int(11), not null, auto_increment从1开始。

假设你有10000条记录。 很显然,最后记录的ID为10000。 一旦你删除3条记录,你有9,997表中的记录,但值的最后一个记录ID仍然是10,000(如果没有被删除的最后一条记录)。

如何显示什么记录都已经被使用一个SQL语句删除?

谢谢。

Answer 1:

我认为,最简单的办法是有一个虚拟/ TEMP表只是IDS。 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


Answer 2:

你会发现这个SQL用武之地了http://www.sqlservercurry.com/2009/06/find-missing-identity-numbers-in-sql.html



Answer 3:

我用这个答案作为参考。

您可以使用下面的查询,找到差距,这在本质上会给你删除的记录“范围”。 例如,在下面的例子中,你获得2行早在最终结果,和值是2和3,6和7。所以,你知道,通过3第2行的ID已被删除,并用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


Answer 4:

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); 

但它采取大量的时间。 我们必须减少时间。



Answer 5:

因此,开始时,我要展现给产生10.000记录的最简单的方法。 没有巨大的屁股查询,没有变量。 执行时间:〜3毫秒。 链接

现在关于该触发器,我答应了。 链接

正如你所看到的,它是很容易创建一个。 请记住,触发不仅是没有必要的各种联接好,但你也可以存储日期,用户ID,等等,等等(非常扩张的例子即是)。 并触发点主要在连接是:你不关心有多少条记录有/是/会。 你并不需要严格大小约。 这就是为什么我叫山姆易建联不够专业的答案。 对不起,误会,我很肯定我们没有想侮辱任何人。

通过创建这个例子,我也学到了一些东西。 希望你确实做了:)



文章来源: sql query to get deleted records