【问题标题】:get list of deleted primary key from auto increment primary key从自动增量主键获取已删除主键列表
【发布时间】:2013-11-04 14:17:53
【问题描述】:

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

【问题讨论】:

  • 为什么要这样做?一般来说,最好只留下自动增量序列中的空白。
  • 是 SQL Server 还是 MySQL?请不要标记模棱两可
  • 我想这样做是因为我的客户不了解主键,他说如果我的总产​​品小于 1000,为什么 productno 大于这个。报告部分在 asp 中,我无法更改。这是mysql。
  • 所以向您的客户解释 PK。不要乱用 AUTO_INCREMENTing 键!
  • 自动增量不会回滚,因此如果事务因任何原因回滚,则序列中会出现间隙。如果文档需要序列号,自动递增是一个不好的选择。

标签: mysql gaps-and-islands


【解决方案1】:

您可以尝试创建一个临时表,用例如填充它。 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)

请注意,它应该像每天的动作或某事导致它的内存效率非常低

【讨论】:

    【解决方案2】:

    见小提琴: 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。否则这不起作用。

    【讨论】:

      猜你喜欢
      • 2014-06-24
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多