0

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

4

5 回答 5

2

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

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

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

ALTER TABLE your_table
ADD column inserted_timestamp TIMESTAMP default current_timestamp;

SQLFiddle 演示

于 2013-10-18T05:43:53.937 回答
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
于 2013-10-21T10:03:29.710 回答
0

添加将指定已删除的列

例子:

1 - 已删除

0 - 未删除

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

primary key column 2 column3 ..... deleted
1                                    1
2                                    0
3                                    0
4                                    1
5                                    0
于 2013-10-21T08:01:26.373 回答
0

你应该保持原样。

但是,如果您确实需要,您可以“重新计算”主键,即索引:

set @pk:=0;

update 
  your_table
  set pk=@pk:=@pk+1
  order by pk;   
于 2013-10-18T06:23:11.097 回答
-1

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

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

于 2013-10-18T05:44:24.220 回答