代码之家  ›  专栏  ›  技术社区  ›  mrpatg

如何重新索引mysql表

  •  7
  • mrpatg  · 技术社区  · 15 年前

    我有一张有许多行的桌子,但它们有问题。我使用字段“id”作为主键。我还有一个“日期”字段,它是一个日期时间字段。

    如何重新索引表,以便根据日期字段按时间顺序标识条目

    6 回复  |  直到 8 年前
        1
  •  8
  •   Josh    15 年前

    我这样做的方法是创建一个带有自动增量索引的新表,然后只需选择所有旧表,并按日期排序。然后你可以把旧桌子移走。

        2
  •  10
  •   Ryun    11 年前

    比如使用变量的简单查询如何:

    set @ROW = 0;
    UPDATE `tbl_example` SET `id` = @ROW := @ROW+1 ORDER BY `fld_date` ASC;
    

    这将在您的日期前订购您的行,如:0、1、2、4、5…等。

        3
  •  9
  •   Wyzard    15 年前

    为什么您希望ID序列与日期相关联?听起来你想这么做 ORDER BY id 让这些行按日期顺序返回。如果要按日期顺序排列行,只需使用 ORDER BY date 相反。

    autoincrement id列中的值应视为任意值。依靠你的身份证是一个坏主意。

        4
  •  6
  •   zombat    15 年前

    下面的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 在您的查询中。这是一个昂贵的操作,因为它需要完全重新创建索引,所以我不建议经常这样做。

        5
  •  2
  •   sibidiba    15 年前

    你可以使用 ALTER TABLE 按订单排序; ORDER BY的允许语法与SELECT语句中的语法相同。

        6
  •  0
  •   Стилян Горанов    8 年前

    我不得不做类似的事情。最好的方法是( 如果需要的话,可以在一个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;
    

    只是不要忘了用表名和按列排序来更改“您的表”。 在这里,我一步一步地向你解释你在做什么:

    1. 首先添加一个名为“temp_id”的新列( 确保它不是您正在使用的名称 ;
    2. 接下来,添加一个等于0的临时变量( 或者从你的身份证开始 ;
    3. 然后,按设置顺序逻辑逐行更新表,将新列“temp_id”的值设置为所设置的变量,然后将该变量增加1( 你可以在这里做一些奇怪的事情,例如,如果你想让你的ID始终是相等的,你可以设置@a+2 ;
    4. 下一步是删除旧的列ID;
    5. 然后将temp_id列的名称改回id,并将其作为一个正整数,自动递增,这是表的主键。
    6. 因为id现在是新添加的temp_id列,所以它位于表结构的末尾。要再次将其作为第一列移动,请运行最后一个查询,以确保它是第一列。