在MySQL中清理使用自动增量的表

时间:2017-07-30 12:38:27

标签: mysql sql database

我的表格如下:

table_id | letters
-------- | -------
     4   |    a
    10   |    b
    24   |    c
    78   |    d
   110   |    e
   234   |    f

table_id使用选项AUTO_INCREMENT。 (这些价值观是因为我的程序中有一个奇怪的错误......不要问:-))

我想用以下结果清理它:

table_id | letters
-------- | -------
    1    |    a
    2    |    b
    3    |    c
    4    |    d
    5    |    e
    6    |    f

这可能吗?

有没有办法通过cronjob或其他东西自动清理它?

解决方案:

Gordons回答的第一个解决方案确实正常。但我需要添加一些代码,因为auto_increment并不想自动重置。 最终的解决方案是:

SET @rn := 0;

UPDATE t 
SET 
    table_id = (@rn:=@rn + 1)
ORDER BY table_id;

SELECT 
    COUNT(*)
INTO @AutoInc FROM
    t;

SET @s:=CONCAT('ALTER TABLE t AUTO_INCREMENT=', @AutoInc + 1);
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

(重置我使用this解决方案的计数器)

3 个答案:

答案 0 :(得分:1)

尝试执行以下操作:

set @rn := 0;

update t
    set table_id = (@rn := @rn + 1)
    order by table_id;

如果这不起作用,你可以使用truncate-and-reload把戏:

create table temp_t as
    select t.*
    from t;

truncate table t;

insert into t(letters)
    select letters
    from temp_t
    order by table_id;

答案 1 :(得分:1)

作为附注,并且根据表格类型(InnoDB,MyISAM ...)请注意,一旦清理了表格,下一个插入的行可能会使用(max id + 1),如您所料,或者它可以使用从最后一个插入中使用的auto_increment值(在你的情况下它将是235)。

如果是这种情况,请使用:

ALTER TABLE tbl AUTO_INCREMENT = 7;

(我使用7,因为你的例子有6行,相应调整)。

答案 2 :(得分:0)

以下是使用Self Join

的一种方法
SELECT Count(*) table_id, 
       a.letters
FROM   Yourtable a 
       JOIN Yourtable b 
         ON a.table_id >= b.table_id 
GROUP  BY a.table_id, 
          a.letters