mysql - 如何更新现有记录以在 MySQL 中具有新的 auto_increment id?

标签 mysql auto-increment

我有一个表,其主键(名称为“id”)定义为 auto_increment。我在 INSERT 语句中使用 NULL 来“填充”id 值。它当然有效。但是现在我需要将现有记录“移动”到新的主键值(下一个可用的值不是那么重要,但它必须是新的,如果按 id 排序则为最后一个)。我怎样才能以“优雅”的方式做到这一点?由于“在 INSERT 中使用 NULL”对 UPDATE 不起作用:

update idtest set id=NULL where id=1;

这只是使记录的 id 为零。我希望做与 INSERT 相同的事情,但我的想法似乎不正确。

当然,我可以使用“INSERT ... SELECT”语句,然后对旧记录执行 DELETE,或者我可以使用 MAX(id) + 1 之类的语句一步更新旧记录的 ID,等等, 但我很好奇是否有更好的解决方案。

此外,MAX(id) 解决方案似乎也不起作用:

mysql> update idtest set id=max(id)+1 where id=3;
ERROR 1111 (HY000): Invalid use of group function
mysql> update idtest set id=(select max(id)+1 from idtest) where id=3;
ERROR 1093 (HY000): You can't specify target table 'idtest' for update in FROM clause

最佳答案

我是这么认为的:

UPDATE users SET id = (SELECT `AUTO_INCREMENT`
FROM  INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'test'
AND   TABLE_NAME   = 'users') WHERE id = 2;

select * from users;

我用自己的表代替你的。

test 是数据库名称,users 是表名称,id 在我的例子中是 AUTO_INCREMENT

编辑:我上面的查询工作完美,但它的副作用有点“危险”,在下一次插入时 AUTO_INCREMENT 值将与最近更新的记录冲突,因此下一次插入将失败.为避免这种情况,我将上述查询修改为交易:

START transaction;

    UPDATE users SET id = (SELECT `AUTO_INCREMENT`
        FROM  INFORMATION_SCHEMA.TABLES
        WHERE TABLE_SCHEMA = 'test'
        AND   TABLE_NAME   = 'users') WHERE id = 2;

    #renew auto increment to avoid duplicate warning on next insert
    INSERT IGNORE INTO users(username) values ('');

COMMIT

如果不是 OP,希望这对某人有帮助。

关于mysql - 如何更新现有记录以在 MySQL 中具有新的 auto_increment id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23908010/

相关文章:

mysql - 如何使用mysql替换字符串的一部分

mysql - 需要添加什么索引才能使该查询正常工作?

mysql - 使用 SELECT MySQL 加入

php - 使用mysql将数据库信息拉入PHP脚本内的html表中

mysql - 如何设置同一个表中某些行的列值与其他行的列值相同?

mysql - 数据库迁移 : auto-incremented foreign key trouble

c# - Sql Server CE - 临时禁用特定列的自动递增

mysql - 当它引用的字段自动递增时,我如何有效地模仿外键约束?

java - 自动增量问题-向数据库添加条目并同时显示它们的最佳方式

mysql - 尝试给MYSQL添加主键