我有一个表A,它有一个自动递增序列号字段SLNO。当我在表中插入值时,它会自动递增,例如 1,2,3,4...等。但是当我从表中删除一行时,顺序会中断。即,如果删除序列号为 2 的行,则序列号字段将为 1,3,4。但是我想保持像 1,2,3 这样的连续顺序甚至删除行。有没有办法维持这个顺序,比如使用触发器或其他东西
主自动增量键仅用于唯一标识记录。就算了吧。
不要滥用主键作为记录顺序的指示器。如果您需要特定的记录顺序,请为此使用额外的列。例如timestamp
列。
如果需要记录的特定顺序,请使用默认值为 current_timestamp
的timestamp
列。这样它将自动插入。
ALTER TABLE your_table
ADD column inserted_timestamp TIMESTAMP default current_timestamp;
SQLFiddle demo
你应该保持原样。
但是,如果您确实需要,则可以"重新计算"主键,即索引:
set @pk:=0;
update
your_table
set pk=@pk:=@pk+1
order by pk;
添加一个将被删除的列
例:
1 - 已删除
0 - 未删除
并在选择查询中添加已删除位置 = 0
primary key column 2 column3 ..... deleted
1 1
2 0
3 0
4 1
5 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
您可以通过更改表并删除主键,然后再次创建主键来完成。
但是为什么你需要这个。如果已将此键用作其他表中的外键。然后你丢失了所有数据。