mysql - 从自动增量主键中获取已删除主键的列表

标签 mysql gaps-and-islands

我有一个表,其中 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。

最佳答案

参见 fiddle : 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。否则这不起作用。

关于mysql - 从自动增量主键中获取已删除主键的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19590248/

相关文章:

php - 在 Magento 的高级搜索页面中更改属性排序

sql - GROUP BY 和聚合顺序数值

sql - 基于其他列中条件的累计和

SQL查询按时间对项目进行分组,但前提是彼此靠近?

sql - 按分组列值的变化对数据进行分组

两个unix时间戳之间的MYSQL查询

MySQL 子查询的 IF 语句

mysql - SQL语句中的临时变量

php - 提交插入查询然后重新加载页面

MySQL 在不加入临时表的情况下使用 GROUP BY DATE(table.timestamp) 时填写缺失的日期