你有一个表table1
包含id
列,即int(11), not null, auto_increment
从1开始。
假设你有10000条记录。 很显然,最后记录的ID为10000。 一旦你删除3条记录,你有9,997表中的记录,但值的最后一个记录ID仍然是10,000(如果没有被删除的最后一条记录)。
如何显示什么记录都已经被使用一个SQL语句删除?
谢谢。
你有一个表table1
包含id
列,即int(11), not null, auto_increment
从1开始。
假设你有10000条记录。 很显然,最后记录的ID为10000。 一旦你删除3条记录,你有9,997表中的记录,但值的最后一个记录ID仍然是10,000(如果没有被删除的最后一条记录)。
如何显示什么记录都已经被使用一个SQL语句删除?
谢谢。
我认为,最简单的办法是有一个虚拟/ 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
你会发现这个SQL用武之地了http://www.sqlservercurry.com/2009/06/find-missing-identity-numbers-in-sql.html
我用这个答案作为参考。
您可以使用下面的查询,找到差距,这在本质上会给你删除的记录“范围”。 例如,在下面的例子中,你获得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
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);
但它采取大量的时间。 我们必须减少时间。
因此,开始时,我要展现给产生10.000记录的最简单的方法。 没有巨大的屁股查询,没有变量。 执行时间:〜3毫秒。 链接
现在关于该触发器,我答应了。 链接
正如你所看到的,它是很容易创建一个。 请记住,触发不仅是没有必要的各种联接好,但你也可以存储日期,用户ID,等等,等等(非常扩张的例子即是)。 并触发点主要在连接是:你不关心有多少条记录有/是/会。 你并不需要严格大小约。 这就是为什么我叫山姆易建联不够专业的答案。 对不起,误会,我很肯定我们没有想侮辱任何人。
通过创建这个例子,我也学到了一些东西。 希望你确实做了:)