使用 SQL 命令更改 MySQL 数据库中的 ID 值
Posted
技术标签:
【中文标题】使用 SQL 命令更改 MySQL 数据库中的 ID 值【英文标题】:Changing ID values in MySQL database with SQL command [duplicate] 【发布时间】:2020-01-10 04:35:51 【问题描述】:我的 mysql 数据库中有一个表,其中 id
的条目从 3000
开始,因为之前的行已被删除。我想要实现的是更改 id
列的值。我需要从1
开始的行。如果我有1900
条目,我需要id
从1
到1900
。我数据库中的 id 列设置为AUTO_INCREMENT
,id
是主键。
我的问题是,是否可以使用 SQL 命令来实现这一点?还是我应该创建一个新数据库并使用新的id
传输对象?
【问题讨论】:
我的问题是“为什么?” 第一个问题是:你为什么关心?更改主键是一个非常糟糕的主意。如果该表被任何其他表引用,那么您将遇到引用完整性问题。 简而言之,id 用在 url 中,必须从 1 开始。@CaiusJard Jard 为什么它们必须从 1 开始? 不希望听起来刺耳,但“因为它们进入一个 url”可能是我听说过的最弱的原因之一,因为它们具有从 1 开始的连续 ID - 听起来像是安全漏洞正在等待发生。 , 【参考方案1】:这里提到https://***.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
声明了外键,那么它们也会得到新的值。【参考方案2】:
您最好删除该列并再次添加它,因为它肯定会导致作为主键的数据不一致,而且如果它成为其他表中的引用作为外键,那么即使在删除后也会产生更多问题专栏
您需要删除该列,然后使用自动增量再次添加它,如果它也是一个外键,那么您必须使用 CASCADE 从两个表中删除约束。
【讨论】:
只有在所有条记录被删除之后。如果在仍有 id 为 3000+ 的记录时执行此操作,则下一个 id 将比表中的最后一条记录大 1。它不会对记录重新编号。 您的意思是 301 将是开头的值。是的,我想我做错了,嗯..会更新我想更好的选择是删除此列并重新创建它 否 - 更好的选择是忘记重新编号主键值。以上是关于使用 SQL 命令更改 MySQL 数据库中的 ID 值的主要内容,如果未能解决你的问题,请参考以下文章