将 autoincrement id 字段加一

Posted

技术标签:

【中文标题】将 autoincrement id 字段加一【英文标题】:Increment autoincrement id field by one 【发布时间】: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 问题及其答案。 为什么(你认为)你需要这个? 逻辑上你永远不需要这个 【参考方案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 数据库。 Query to find foreign keys 如果我使用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”(这实际上是问题的原因)。它按顺序工作,而不是在一组操作中。玉玉:)

以上是关于将 autoincrement id 字段加一的主要内容,如果未能解决你的问题,请参考以下文章

Prisma:如何在查询返回中添加一列?

请问一下在mysql中,将查询一个语句的结果中增加一列ID字段并让其自动增长, 这怎么做到?

SQL AUTO INCREMENT 字段

使用 select 和 autoincrement 插入 postgres 表

AUTOINCREMENT列字段要求输入值

如何在 Codeigniter 中插入动态数据?