我有一张包含很多行的表,但是它们出了故障。我使用字段“id”作为主键。我还有一个“日期”字段,它是一个日期时间字段。
我如何重新索引表格,以便根据日期字段按时间顺序记录条目
答案 0 :(得分:10)
如何使用变量进行简单查询:
set @ROW = 0;
UPDATE `tbl_example` SET `id` = @ROW := @ROW+1 ORDER BY `fld_date` ASC;
这将按您的日期订购您的行,如:0,1,2,4,5 ......等。
答案 1 :(得分:9)
我这样做的方法是创建一个带有自动增量索引的新表,然后选择所有旧表,按日期排序。然后你可以删除旧桌子。
答案 2 :(得分:9)
为什么您希望ID序列与日期相关联?听起来你想做ORDER BY id
并按日期顺序返回行。如果您想要按日期顺序排列,请改用ORDER BY date
。
自动增量ID列中的值应视为任意值。依赖于您的ID在日期顺序是一个坏主意。
答案 3 :(得分:6)
以下SQL代码段应该可以执行您想要的操作。
ALTER TABLE test_table ADD COLUMN id2 int unsigned not null;
SET @a:=0;
UPDATE test_table SET id2=@a:=@a+1 ORDER BY `date`;
ALTER TABLE test_table DROP id;
ALTER TABLE test_table CHANGE id2 id int UNSIGNED NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (id);
请注意,一旦开始插入和删除数据,就永远无法保证自动递增列的顺序,因此除非您使用ORDER BY
指定的顺序,否则不应该依赖任何顺序查询。这是一项昂贵的操作,因为它需要完全重新创建索引,所以我不建议经常这样做。
答案 4 :(得分:2)
您可以使用ALTER TABLE t ORDER BY col; ORDER BY的允许语法与SELECT语句中一样。
答案 5 :(得分:1)
如果您正在使用类似phpmysql的方法,则可以通过以下方式实现:
这将做什么?
@Wyzard提到在从表中检索列时仅按日期对列进行排序(而不是重新索引)。实际上,既然主键应该是任意的(除了任何外键和可能是使用平台(但这是另一回事))。
答案 6 :(得分:0)
我必须做类似的事情。执行此操作的最佳方法如下(如果需要,可以在一个SQL查询中运行它,但请记住,这是一个缓慢且非常耗费资源的操作):
在开始此查询之前,务必备份您的表格,包括结构和数据!
ALTER TABLE your_table ADD COLUMN temp_id INT UNSIGNED NOT NULL;
SET @a:=0;
UPDATE your_table SET temp_id=@a:=@a+1 ORDER BY `date` ASC;
ALTER TABLE your_table DROP id;
ALTER TABLE your_table CHANGE temp_id id INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (id);
ALTER TABLE your_table CHANGE COLUMN id id INT(10) FIRST;
请不要忘记使用表名和ORDER BY列更改“your_table”。 在这里,我将逐步向您解释您正在采取的方式: