2012-03-16 65 views
0

我有一个表,看起来像这样MYSQL +更新ID列

CREATE TABLE IF NOT EXISTS `language` (
    `idkey` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `english_lang` text, 
    `japanese_lang` text, 
    PRIMARY KEY (`idkey`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1587 ; 

的“idkey”只是一个数字,从1个开始和增量。

的“idkey”目前从条目编号差距我删除,我想看看是否有可能因此在编号之间没有间隙运行MySQL命令重新写这个专栏。

例如:重写它,使它从1开始,一直运行到结束(大约1400个条目)。

谢谢

+0

看起来像idkey应该是一个主键,通常开始重新编号主键是一个坏主意。为什么要这样做有特定的原因吗? – Corbin 2012-03-16 08:02:55

+0

表是一个静态表,它所涉及的网站也在开发中。主键也不涉及其他任何事情。只是希望修正订货之前,我去现场,但很难人工手动为japanese_lang文本字段是unicode的,当我尝试在大多数编辑器手动更新值都将丢失做......此外,它需要很长的时间来更新1400号......只是一个不错的... hopeing有人可能知道一个简单的MySQL更新命令,从而能够重新写一个这样的列... – Adam 2012-03-16 08:10:14

回答

1

试图填写这些“缺失的数字”是违反标准做法的。你需要考虑到他们曾经被分配过某种东西。现在将它们分配给别的东西可能会导致问题 - 特别是如果您不使用外键约束并且有一些不良数据在使用。

如果您处于某种情况下,您测试了一些数据并且现在想要将事情处理好,可以通过运行Alter Table TABLENAME AUTO_INCREMENT=1(或任何其他数字)来重置自动增量,或者可以删除并重新创建该表。如果它已经投入生产,我会建议不要重新设置或试图“填补空白”。

为了完整性,我相信你可以通过在你的插入语句中包含一个特定的数字来在正常的自动递增列中插入一个特定的数字。下一个自动增量编号应该从您指定的那个中选取。如果它已经被采用,这会导致你的问题。

如果你真的只想缩小差距,最简单的方法是创建一个具有相同结构的新表。然后运行如下查询:

INSERT INTO 
    newtable (column2, column3, column4,...) 
VALUES 
    SELECT column2, column3, column4,... FROM oldtable; 

删除旧表并重命名新表。缺口将被填充,并且您的自动增量编号将位于“正确”位置。

但是您真的应该从已删除的记录中删除差距。

+1

完美的答案。不要填补空白,因为它们有意义(曾经有过的东西)。 – 2012-03-16 08:05:14

+0

理解 - 但该表不活,关键不涉及到任何东西。想你的alter table命令和编号仍然很零散.... – Adam 2012-03-16 08:11:05

+0

ALTER TABLE命令简单地将其返回到任何你指定,那么下一个ID将有回升。它不会自动选择下一个空的ID。 要做的最简单的事情是创建一个具有相同结构的新表,然后从当前表中删除ID列中的数据。我会将其添加到答案中。 – Ilion 2012-03-16 08:13:02

0

是的,你可以这样做,因为主键是单行的每一行,如果你的列是自动增量,那么你可以做到这一点,手动,你可以做到这一点。但是你问的是关于排序的问题,但是语法与创建表相关。