使用 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 条目,我需要id11900。我数据库中的 id 列设置为AUTO_INCREMENTid 是主键。

我的问题是,是否可以使用 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 值的主要内容,如果未能解决你的问题,请参考以下文章

怎么在mysql命令行执行一个sql文件

我想修改mysql数据库的名字,可以怎么修改

mysql主从复制和读写分离

mysql,oracle,sql server中的默认事务隔离级别查看,更改

MySQL主从配置

更改SQL Server 2012 数据库排序规则