【问题标题】:Changing ID values in MySQL database with SQL command [duplicate]使用 SQL 命令更改 MySQL 数据库中的 ID 值
【发布时间】:2020-01-10 04:35:51
【问题描述】:

我的 MySQL 数据库中有一个表,其中 id 的条目从 3000 开始,因为之前的行已被删除。我想要实现的是更改 id 列的值。我需要从1 开始的行。如果我有1900 条目,我需要id11900。我数据库中的 id 列设置为AUTO_INCREMENTid 是主键。

我的问题是,是否可以使用 SQL 命令来实现这一点?还是我应该创建一个新数据库并使用新的id 传输对象?

【问题讨论】:

  • 我的问题是“为什么?”
  • 第一个问题是:你为什么关心?更改主键是一个非常糟糕的主意。如果该表被任何其他表引用,那么您将遇到引用完整性问题。
  • 简而言之,id 用在 url 中,必须从 1 开始。@CaiusJard Jard
  • 为什么它们必须从 1 开始?
  • 不希望听起来刺耳,但“因为它们进入一个 url”可能是我听说过的最弱的原因之一,因为它们具有从 1 开始的连续 ID - 听起来像是安全漏洞正在等待发生。 ,

标签: mysql sql


【解决方案1】:

您最好删除该列并再次添加它,因为它肯定会导致作为主键的数据不一致,而且如果它成为其他表中的引用作为外键,那么即使在删除后也会产生更多问题专栏

您需要删除该列,然后使用自动增量再次添加它,如果它也是一个外键,那么您必须使用 CASCADE 从两个表中删除约束。

【讨论】:

  • 只有在所有条记录被删除之后。如果在仍有 id 为 3000+ 的记录时执行此操作,则下一个 id 将比表中的最后一条记录大 1。它不会对记录重新编号。
  • 您的意思是 301 将是开头的值。是的,我想我做错了,嗯..会更新我想更好的选择是删除此列并重新创建它
  • 否 - 更好的选择是忘记重新编号主键值。
【解决方案2】:

这里提到https://stackoverflow.com/a/43137256/5031885

UPDATE table_name SET id  = 0 - id;
set @counter = 0;
UPDATE table_name SET id  = (@counter := @counter + 1);

这将首先将所有 id 值设置为负等值,然后循环每一行,更新和递增计数器。

如果 id 列未签名,此解决方案将不起作用。 另外,请记住,这不会改变当前的 AUTO_INCREMENT 指针。

为了帮助自动递增,您可以使用:

ALTER TABLE table_name AUTO_INCREMENT = 1;

即使我们将 1 分配给 AUTO_INCREMENT,它也会继续使用下一个键。

【讨论】:

  • 你建议如何处理外键?
  • 如果你用ON UPDATE CASCADE声明了外键,那么它们也会得到新的值。
猜你喜欢
  • 1970-01-01
  • 2013-02-05
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 2011-06-14
  • 1970-01-01
相关资源
最近更新 更多