【问题标题】:MYSQL + Update ID ColumnMYSQL + 更新 ID 列
【发布时间】:2012-03-16 07:55:33
【问题描述】:

我有一张像这样的表

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 个条目)。

谢谢

【问题讨论】:

  • 看起来 idkey 应该是主键,通常开始重新编号主键是个坏主意。您是否有特定的原因要这样做?
  • 该表是一个静态表,它所关联的网站也在开发中。主键也与其他任何内容无关。只是想在我上线之前修复排序但是很难手动完成,因为 Japanese_lang 文本字段是 unicode 并且当我尝试在大多数编辑器中手动更新时值会丢失......而且更新需要很长时间1400 个数字......真是太好了......希望有人知道一个简单的 MySQL 更新命令,它能够重写这样的列......

标签: mysql


【解决方案1】:

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

如果您在测试一些数据的情况下现在想要将其变为现实,您可以通过运行 Alter Table TABLENAME AUTO_INCREMENT=1(或任何其他数字)重置自动增量,或者您可以删除并重新创建表。如果它已经投入生产,我建议不要重置或尝试“填补空白”。

为了完整起见,我相信您可以通过将特定数字包含在您的插入语句中来在通常自动递增的列中插入特定数字。下一个自动递增编号应从您指定的编号中选取。如果它已经被占用,这会给你带来麻烦。

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

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

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

但你真的应该在已删除的记录中留下空白。

【讨论】:

  • 完美答案。不要填补空白,因为它们是有意义的(曾经存在过)。
  • 了解 - 但是表格不是实时的,并且密钥与任何东西都没有关系。尝试了您的 alter table 命令,编号仍然是零散的......
  • alter table 命令只是将它返回到您指定的任何位置,因此下一个 ID 将从那里获取。它不会自动选择下一个空 ID。您要做的最简单的事情是创建一个具有相同结构的新表,然后插入当前表中的数据,减去 ID 列。我会把它添加到答案中。
  • 谢谢你,我会记得留下空白......感谢
【解决方案2】:

是的,你可以这样做,因为每行的主键都是单一的,如果你的列是自动递增的,那么你不能这样做,手动你可以做到这一点。但是您询问的是行输入,但语法与创建表有关。

【讨论】:

    猜你喜欢
    • 2014-03-08
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2021-07-10
    相关资源
    最近更新 更多