选择时间 来自帖子 按时间顺序ASC;
这将在列表中为我订购我的帖子。我想重新排序表本身,确保没有丢失的表ID。因此,如果我删除第2列,我可以重新排序,以便第3行将成为第2行。
我该怎么做?按日期列对表重新排序,因此总是增加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
已经正确订购,并且您只是消除了差距,那就不应该发生。