【问题标题】:Increment autoincrement id field by one将 autoincrement id 字段加一
【发布时间】:2012-04-20 01:48:48
【问题描述】:

我有一个 MySQL 5 服务器和一个表,其中 id 字段(主键)具有自动增量。现在我想在两者之间添加一条记录,因此我必须将所有其他 id 加一。这是我尝试过的:

UPDATE myTable SET id=id+1 WHERE id >= 53

这不起作用,因为例如已经存在 id = 52 的记录。我怎样才能做到这一点?如果他从最后一个条目开始并进行更新,我认为它应该可以工作。但是怎么做呢?

【问题讨论】:

  • 主要的目的是为一行提供一个身份,而不是order他们。使用单独的列来指定您想要的顺序。插入后更改行的主键只会给您带来问题。
  • 如果删除并重新创建自动增量字段怎么办?
  • 删除并重新创建列(或尝试重新编号现有行)将不起作用,特别是如果您已经在其他地方使用了 ID 作为外键。 (它会断开​​与现有行的连接。)你真的应该听@MarkByers - “在插入后更改一行的主键只会给你带来问题。”另请参阅this SO 问题及其答案。
  • 为什么(你认为)你需要这个?
  • 逻辑上你永远不需要这个

标签: mysql sql database auto-increment increment


【解决方案1】:

我认为没有充分的理由。只有问题。在运行以下语句之前,请检查您是否定义了 FOREIGN 键,这些键引用了此 id。它们是否设置为ON UPDATE CASCADE?另外,您是否有任何与此表相关的触发器?

但首先要考虑,为什么你(认为你)需要这个。它会用于订购桌子吗?在这种情况下,正如@Mark 指出的那样,您应该使用单独的列来指定所需的顺序。


但是,如果您决定确实需要这个,请使用:

UPDATE myTable 
SET id = id + 1 
WHERE id >= 53
ORDER BY id DESC  ;

【讨论】:

  • 我不使用它来订购。有没有使用 MySQL 查询浏览器检查外键的快速方法?触发器也一样...
  • 要查找该表是否有到其他表的FK,只需使用SHOW CREATE TABLE myTable。要查找其他人是否有此表的 FK,您必须使用 information_schema 数据库。
  • 如果我使用SELECT * FROM information_schema.TABLE_CONSTRAINTS T,我只会看到PRIMARY KEYUNIQUE。所以应该没有外键。触发器也有什么东西吗?
  • SHOW TRIGGERSSHOW TRIGGERS FROM database_name: Show triggers syntax 在 MySQL 中。
【解决方案2】:

您只需 2 个步骤即可快速而肮脏地完成。

  • 将 id 增加到比其他所有更高的数字
  • 将所有 id 减少到您想要的数字

这样

UPDATE myTable SET id=id+10000 WHERE id >= 53
UPDATE myTable SET id=id-9999 WHERE id >= 53

【讨论】:

    【解决方案3】:

    我也遇到过同样的问题。并且还尝试了 OP 和 @Romain Hoog 的查询。但没有成功。

    最后在excel中导出整个表格的数据并在excel中完成(不是一个一个,而是使用使其非常快的技巧)。

    然后备份原始表重新创建新表并从更新的excel中导入数据。

    【讨论】:

    • 你在 Excel 中做了什么?简单地 + 1 作为公式?我考虑过 CSV 导出,然后在这里编辑数据。稍后使用LOAD DATA INFILE "data.csv" REPLACE INTO TABLE myTable ... 我可以导入数据。你是怎么做到的?
    • 通过拖动 + 符号完成。我使用 UI 工具而不是 LOAD Data 导入了数据。但你也可以这样做。
    【解决方案4】:

    我猜这样的东西可行:

    UPDATE myTable SET id=id+1 WHERE id >= (select id from myTable order by id DESC)
    

    【讨论】:

    • @Ken:尽管被命名为 auto_...,但如果您不想要默认的 auto_incremented 值,您可以指定一个值。
    • @ypercube:哎呀。并感谢您提供信息:)。还有一个不使用 MySQL 的理由(对我来说,无论如何)。删除我上面的​​评论。
    • AFAIK,同样适用于 SQL-Server 中的标识列。但是通常的行为当然是不手动输入值。
    • @ypercube,而不是首先禁用约束。正常的 INSERT/UPDATE 将忽略您尝试分配给标识列的任何值。这就是为什么我对 MySQL 说 yuk - 能够更新自动增量列意味着它不是自动增量列。
    • @KenWhite:您对 SQL-Server 的看法是正确的。 SQL-Server Identity 的工作方式与 (MySQL) auto_increment 不同。 MySQL 中的 UPDATE 语句有一个更丑陋的“yuk”(这实际上是问题的原因)。它按顺序工作,而不是在一组操作中。玉玉:)
    猜你喜欢
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2022-10-03
    • 1970-01-01
    • 2013-02-20
    • 2016-07-17
    相关资源
    最近更新 更多