MySQL按日期重新排序行ID

时间:2017-04-16 01:24:04

标签: mysql mariadb

选择时间 来自帖子 按时间顺序ASC;

这将在列表中为我订购我的帖子。我想重新排序表本身,确保没有丢失的表ID。因此,如果我删除第2列,我可以重新排序,以便第3行将成为第2行。

我该怎么做?按日期列对表重新排序,因此总是增加1,不存在不存在的行。

1 个答案:

答案 0 :(得分:0)

免责声明:我不知道您为什么需要这样做,但如果您这样做,这只是众多方式中的一种,完全独立于引擎或服务器版本。

<强>设定:

CREATE TABLE t (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `time` time DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

INSERT INTO t (`time`) VALUES ('13:00:00'),('08:00:00'),('02:00:00');
DELETE FROM t WHERE id = 2;

初始条件:

SELECT * FROM t ORDER BY `time`;
+----+----------+
| id | time     |
+----+----------+
|  3 | 02:00:00 |
|  1 | 13:00:00 |
+----+----------+
2 rows in set (0.00 sec)

<强>动作:

CREATE TRIGGER tr AFTER UPDATE ON t FOR EACH ROW SET @id:=@id+1;
ALTER TABLE t ADD COLUMN new_id INT NOT NULL AFTER id;
SET @id=1;
UPDATE t SET new_id=@id ORDER BY time;
DROP TRIGGER tr;

<强>结果:

SELECT * FROM t ORDER BY `time`;
+----+--------+----------+
| id | new_id | time     |
+----+--------+----------+
|  3 |      1 | 02:00:00 |
|  1 |      2 | 13:00:00 |
+----+--------+----------+
2 rows in set (0.00 sec)

<强>清理:

此外,您可以做任何更适合您的情况(无论是更快,更少阻挡,取决于其他条件)。您可以更新现有的id列,然后删除额外的一列:

UPDATE t SET id=new_id;
ALTER TABLE t DROP new_id;

SELECT * FROM t ORDER BY `time`;
+----+----------+
| id | time     |
+----+----------+
|  1 | 02:00:00 |
|  2 | 13:00:00 |
+----+----------+
2 rows in set (0.00 sec)

或者,您可以删除现有的id列并将new_id提升为主键。

<强>注释:

相同方法的自然变体是将其包装到存储过程中。它基本相同,但需要更多文字。它的好处是您可以在下次需要时保留该程序。

假设您在id上有唯一索引,一般情况下需要临时列new_id,因为如果您直接开始更新id,则可能会遇到唯一的密钥违规。如果您的id已经正确订购,并且您只是消除了差距,那就不应该发生。