【问题标题】:Update autoincrement field to highest value + 1将自动增量字段更新为最大值 + 1
【发布时间】:2015-01-23 20:13:00
【问题描述】:

如何更新现有行的 id(自动增量)字段,为其赋予通常会自动分配给新插入的值(即最高 id + 1)?

http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html 状态:

"...您也可以显式地将 0 分配给列以生成序列号。"

但这似乎不是真的。我已经尝试分配一个值 0,它就是这样做的......分配一个值 0。

我考虑过删除并重新插入该行,但这似乎很乱。

也试过了:

UPDATE example_table
SET id = (SELECT id+1 FROM example_table ORDER BY id DESC LIMIT 1)
WHERE id = 1000;

返回错误:您不能在 FROM 子句中指定目标表 'example_table' 进行更新

和:

UPDATE example_table SET id = max(id)+1 WHERE id = 1000;

返回错误:组函数使用无效

这似乎应该很容易......我错过了什么?

【问题讨论】:

    标签: mysql auto-increment


    【解决方案1】:

    MySQL 不允许在 from 子句中使用正在更新的表。 您可以将其作为子查询

    UPDATE example_table
         SET id= (SELECT maxId
                  FROM (SELECT MAX(id) + 1 AS maxId
                        FROM example_table
                       ) t
                  )
        WHERE id = 1000;
    

    【讨论】:

    • 谢谢.. 那真的是最好的方法吗?对于如此简单的任务,子查询中的子查询似乎异常复杂。
    • @billynoah,是的,我同意,或者您需要在变量中获取 maxid 并使用它,但您需要在事务中同时使用它们。
    • 我刚才尝试了你的建议,得到了错误每个派生表都必须有自己的别名
    • @billynoah,已编辑,需要为子查询提供别名
    • 谢谢..我只是做了同样的事情,它的工作原理。不过,仍然对更清洁的解决方案感兴趣。似乎我应该能够将 NULL 或 0 分配给自动增量来实现这一点,如文档中所述。
    【解决方案2】:

    您也可以使用join

    UPDATE example_table CROSS JOIN
           (SELECT MAX(id) + 1 as nextid
            FROM example_table
           ) maxet
        SET id = maxet.nextid
        WHERE id = 1000;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多