我有一个表,其主键(名称为“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/