【问题标题】:How to maintain proper number order in mysql auto increment field when delete rows删除行时如何在mysql自动增量字段中保持正确的数字顺序
【发布时间】:2013-10-26 20:50:33
【问题描述】:

我有一个表 A,其中有一个自动递增序列号字段 SLNO。当我在表中插入值时,它会像 1、2、3、4 等一样自动递增。但是当我从表中删除一行时,顺序会中断。即,如果删除序列号为 2 的行,则序列号字段将为 1、3、4。但我想保持像 1,2,3 这样的连续顺序,甚至删除行。有什么办法可以维持这个顺序,比如使用触发器或其他东西

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    主自动增量键仅用于唯一地标识记录。就这样吧。

    不要滥用主键作为记录顺序的指示符。如果您需要记录的特定顺序,请为此使用额外的列。例如timestamp 列。

    如果您需要特定的记录顺序,请使用默认值为 current_timestamptimestamp 列。这样它就会自动插入。

    ALTER TABLE your_table
    ADD column inserted_timestamp TIMESTAMP default current_timestamp;
    

    SQLFiddle demo

    【讨论】:

    • 我只需要一个指定的记录顺序,你能建议一种方法吗?我正在考虑在删除订单时使用触发器来维护这样的订单,这是正确的选择还是有其他简单的方法
    • 日期和时间没问题,但我想保持序列号,如 1,2,3....等。
    【解决方案2】:

    你应该保持原样。

    不过,如果你确实需要,你可以“重新计算”主键,即索引:

    set @pk:=0;
    
    update 
      your_table
      set pk=@pk:=@pk+1
      order by pk;   
    

    【讨论】:

      【解决方案3】:

      添加一个将指定删除的列

      示例:

      1 - 已删除

      0 - 未删除

      并在您的选择查询中添加 where deleted = 0

      primary key column 2 column3 ..... deleted
      1                                    1
      2                                    0
      3                                    0
      4                                    1
      5                                    0
      

      【讨论】:

        【解决方案4】:

        存储多个记录会使删除效率低下。相反,您可以依赖现有的 SLNO 索引,这对于我想到的所有用例来说应该足够了。

        如果您SELECT whatever ORDER BY SLNO LIMIT ... OFFSET k,则返回的行的 ID 为 k、k+1、k+2、...

        如果您想获取知道其 SLNO 的记录的 id:

        SELECT COUNT(SLNO) FROM A WHERE SLNO <= thatnumber
        

        如果要获取thatnumber'th记录:

        SELECT * FROM A ORDER BY SLNO LIMIT 1 OFFSET thatnumber
        

        【讨论】:

          【解决方案5】:

          您可以通过更改表并删除主键然后再次创建主键来做到这一点。

          但是为什么你需要这个。如果您已将此键用作其他表中的外键。然后你丢失了所有数据。

          【讨论】:

          • 在我的回答中,我建议不要做这件事,他可能会丢失他的数据。我知道这个答案效率低下。但从技术上讲,只有这个答案是可能的。
          猜你喜欢
          • 1970-01-01
          • 2012-09-21
          • 2016-11-20
          • 2016-12-02
          • 2013-05-21
          • 1970-01-01
          • 2016-03-24
          • 1970-01-01
          • 2018-01-24
          相关资源
          最近更新 更多