将 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 KEY
和UNIQUE
。所以应该没有外键。触发器也有什么东西吗?
SHOW TRIGGERS
或 SHOW 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 字段加一的主要内容,如果未能解决你的问题,请参考以下文章
请问一下在mysql中,将查询一个语句的结果中增加一列ID字段并让其自动增长, 这怎么做到?