如何重新索引mysql表

时间:2010-01-18 21:51:44

标签: mysql

我有一张包含很多行的表,但是它们出了故障。我使用字段“id”作为主键。我还有一个“日期”字段,它是一个日期时间字段。

我如何重新索引表格,以便根据日期字段按时间顺序记录条目

7 个答案:

答案 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的方法,则可以通过以下方式实现:

  • 转到表(数据库和表的左侧列表),然后
  • 从上方栏中的选项中选择“ SQL”。遵循@Ryun的建议,然后转到“操作”(在上方的栏中),
  • 查找“ TABLE OPTIONS”,保留除“ AUTO_INCREMENT”以外的所有内容,
  • 将“ AUTO_INCREMENT”值设置为1,然后按表格底部的go键。

这将做什么?

  • 它将在每个ID列中设置1到{count}。
  • 然后它将重置表的索引,以便您下一个插入的行等于+1的列数(而不是+1的旧索引)。

@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”。 在这里,我将逐步向您解释您正在采取的方式:

  1. 首先添加名为“temp_id”的新列(确保它不是您已经使用的名称);
  2. 接下来,添加一个等于0的临时变量(或任何你想要的ID从开始);
  3. 然后用设置的ORDER逻辑逐行更新表,为新列“temp_id”设置一个等于你设置的变量的值,然后将此变量增加1(你可以做这里有一些时髦的东西,例如,如果你想让你的ID永远平等,你可以设置@ a + 2 );
  4. 下一步,您删除(删除)旧的列ID;
  5. 然后将temp_id列的名称更改回ID,并将其更改为带有自动增量的正整数,这是表的主键。
  6. 由于ID现在是新添加的temp_id列,因此它位于表结构的末尾。要将其作为第一列再次移动,请运行最后一个查询,以确保它是第一列。