MYSQL + 更新 ID 列

标签 mysql

我有一个看起来像这样的表格

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

谢谢

最佳答案

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

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

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

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

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

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

但实际上您应该在已删除的记录中保留间隙。

关于MYSQL + 更新 ID 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9733714/

相关文章:

php - php中先序树遍历算法的问题

mysql - 不使用 JOIN 查询多个数据库表?

mysql - 如何创建此权利加入

mysql - sql 检查行是否是另一个表的子集

mysql - 为什么直接列值比较在 mysql 中的多个 like 子句后不评估

php - 带时区的 MySQL WeekOfYear()?

mysql 从 1 列中选择 2 个不同的子字符串和单个 WHERE

php - 最好运行 2 个 sql 查询或 1 个并处理重复的结果集?

python转mysql 'Timestamp'对象没有属性 'translate'

php - MySQL 和 PHP - 如何显示字段值等于 x 的所有行?