删除行时如何在mysql自动增量字段中维护正确的数字顺序

时间:2013-10-18 05:41:30

标签: php mysql

我有一个表 A ,其中有一个自动增量序列号字段 SLNO 。当我在表中插入值时,它将自动增加,如1,2,3,4 ...等。但是当我从表中删除一行时,订单会中断。即,如果删除序列号为2的行,那么序列号字段将为1,3,4。但我想保持连续的顺序,如1,2,3甚至删除行。有没有办法维持这个顺序,比如使用触发器或somthing

5 个答案:

答案 0 :(得分:2)

主要自动增量键仅用于唯一识别记录。保持原状。

请勿滥用主键作为记录订单的指示。如果您需要特定的订单您的记录,那么请使用额外的列。例如timestamp列。

如果您需要特定的记录订单,请使用timestamp列,其默认值为current_timestamp。这样它就会自动插入。

ALTER TABLE your_table
ADD column inserted_timestamp TIMESTAMP default current_timestamp;

SQLFiddle demo

答案 1 :(得分:0)

你应该保持原样。

但是,如果你真的需要,你可以“重新计算”主键,索引:

set @pk:=0;

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

答案 2 :(得分:0)

添加一个指定已删除的列

示例:

1 - 已删除

0 - 未删除

并在选择查询中添加删除= 0的位置

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

答案 3 :(得分:0)

存储一些记录会使删除效率低下。相反,您可以依赖现有的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

答案 4 :(得分:-1)

您可以通过更改表并删除主键,然后再次创建主键。

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