mysql - 如何重置序列号以使其连续?

标签 mysql sql database-design sequencing

我有一个 mysql 表,其中每一行在“序列”列中都有自己的序列号。但是,当一行被删除时,它会留下一个空白。所以……

1
2
3
4

...变成...

1
2
4

有没有一种巧妙的方法来“重置”排序,使其在一个 SQL 查询中再次变成连续的?

顺便说一句,我确信这个过程有一个技术术语。有人吗?

更新:“序列”列不是主键。它仅用于确定记录在应用程序中的显示顺序。

最佳答案

如果该字段是您的主键...

...那么,正如该问题的其他地方所述,您不应该更改 ID。这些 ID 已经是唯一的,您既不需要也不想重复使用它们。

现在,就是说...


否则...

对于某些应用程序定义的排序,您很可能有一个不同字段(即,以及 PK)。只要此排序不是某些其他字段中固有的(例如,如果它是用户定义的),那么这就没有问题。

您可以使用(临时)auto_increment 字段重新创建表,然后删除 auto_increment

我很想按升序 UPDATE 并应用递增变量。

SET @i = 0;
UPDATE `table`
   SET `myOrderCol` = @i:=@i+1
 ORDER BY `myOrderCol` ASC;

(查询未经测试。)

每次您删除项目时都这样做似乎很浪费,但不幸的是,使用这种手动订购方法,如果您想保持项目的完整性,您无能为力专栏。

您可以减少负载,这样在删除 myOrderCol 等于 5 的条目后:

SET @i = 5;
UPDATE `table`
   SET `myOrderCol` = @i:=@i+1
 WHERE `myOrderCol` > 5
 ORDER BY `myOrderCol` ASC;

(查询未经测试。)

这会将以下所有值向下“洗牌”。

关于mysql - 如何重置序列号以使其连续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7057216/

相关文章:

php - 将选择值传递给另一个页面 php

sql - 无法创建唯一索引 - 声称具有重复值但实际上没有

sql - 多个不同的数组,其中包含空值

database - 在数据库列中存储分隔列表真的那么糟糕吗?

sql - 代理 key 、合成 key 和人工 key 之间有区别吗?

mySQL 导入/重复键

java - 当表包含使用连接的空值时,如何将数据从数据库添加到 Java Swing 中的 jTable?

php - 有没有办法使用 PHP 而不是使用 mssql_pconnect() 将 MySQL 连接到 SQL DB?

database - 为什么应用程序开发人员可以做数据库的事情,而数据库开发人员却试图远离应用程序的事情?

php - 相同的登录不同的空间