我的表格如下:
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解决方案的计数器)
答案 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