Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 删除行时如何在mysql自动递增字段中保持正确的数字顺序_Php_Mysql - Fatal编程技术网

Php 删除行时如何在mysql自动递增字段中保持正确的数字顺序

Php 删除行时如何在mysql自动递增字段中保持正确的数字顺序,php,mysql,Php,Mysql,我有一个表a,它有一个自动递增的序列号字段SLNO。当我在表中插入值时,它将自动递增,如1,2,3,4。。。等等,但当我从表中删除一行时,顺序会中断。即,如果删除序列号为2的行,则序列号字段将为1,3,4。但是我想保持一个连续的顺序,比如1,2,3,甚至删除行。有没有办法维持这种顺序,比如使用触发器或其他什么主自动递增键只用于唯一地识别记录。别管它了 不要误用主键作为记录顺序的指示器。如果您需要记录的特定顺序,请使用额外的列。例如,时间戳列 如果需要记录的特定顺序,请使用默认值为current\

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

主自动递增键只用于唯一地识别记录。别管它了

不要误用主键作为记录顺序的指示器。如果您需要记录的特定顺序,请使用额外的列。例如,
时间戳

如果需要记录的特定顺序,请使用默认值为
current\u timestamp
timestamp
列。这样它将自动插入

ALTER TABLE your_table
ADD column inserted_timestamp TIMESTAMP default current_timestamp;

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


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

您应该保持原样

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

set @pk:=0;

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

添加一列,该列将说明已删除的内容

例如:

1-已删除

0-未删除

并在select查询中添加where deleted=0

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

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

如果您
选择无限制的任何订单。。。偏移量k
,然后返回的行具有ID k、k+1、k+2

如果要获取记录的id,并知道其SLNO:

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

我只需要为我的记录指定一个顺序,你能建议一种方法吗。我想在删除订单时使用触发器来维护这样的订单,这是正确的选择还是有其他简单的方法可以确定日期和时间,但我想保留序列号,如1,2,3…等。在我的回答中,我建议不要这样做,他可能会丢失他的数据。我知道答案是低效的。但从技术上讲,只有这个答案是可能的。
SELECT * FROM A ORDER BY SLNO LIMIT 1 OFFSET thatnumber