如何填补自增字段的“洞”?

2023-12-09

我读过一些关于此的文章,但没有一篇涉及这个问题。

我想这是不可能的,但我还是会问。

我有一个包含 50.000 多个寄存器的表。这是一个旧表,其中发生了各种插入/删除操作。

也就是说,大约 300 个寄存器中存在各种“漏洞”。即:...、1340、1341、1660、1661、1662、...

问题是。有没有一种简单/容易的方法来让新刀片填补这些“洞”?


我同意@Aaron Digulla 和@Shane N 的观点。这些差距毫无意义。如果他们DO这意味着数据库设计有缺陷。时期。

话虽这么说,如果你绝对需要填补这些漏洞,AND如果您至少运行 MySQL 3.23,则可以利用临时表创建一组新的 ID。这里的想法是,您将按顺序选择所有当前的 ID 到临时表中,如下所示:

CREATE TEMPORARY TABLE NewIDs
(
    NewID INT UNSIGNED AUTO INCREMENT,
    OldID INT UNSIGNED
)

INSERT INTO NewIDs (OldId)
SELECT
    Id
FROM
    OldTable
ORDER BY
    Id ASC

这将为您提供一个将旧 Id 映射到全新 Id 的表,由于 NewId 列的自动增量属性,该表本质上是连续的。

完成此操作后,您需要更新对“OldTable”中的 Id 的任何其他引用及其使用的任何外键。为此,您可能需要删除拥有的所有外键约束,将表中的所有引用从 OldId 更新为 NewId,然后重新建立外键约束。

但是,我认为你不应该这样做ANY对此,只需了解您的 Id 字段存在的唯一目的是引用记录,并且应该NOT有任何特定的相关性。

更新:添加更新 Id 的示例

例如:

假设您有以下 2 个表模式:

CREATE TABLE Parent
(
    ParentId INT UNSIGNED AUTO INCREMENT,
    Value INT UNSIGNED,
    PRIMARY KEY (ParentId)
)

CREATE TABLE Child
(
    ChildId INT UNSIGNED AUTO INCREMENT,
    ParentId INT UNSIGNED,
    PRIMARY KEY(ChildId),
    FOREIGN KEY(ParentId) REFERENCES Parent(ParentId)
)

现在,间隙出现在您的父表中。

为了更新 Parent 和 Child 中的值,首先使用映射创建一个临时表:

CREATE TEMPORARY TABLE NewIDs
(
    Id INT UNSIGNED AUTO INCREMENT,
    ParentID INT UNSIGNED
)

INSERT INTO NewIDs (ParentId)
SELECT
    ParentId
FROM
    Parent
ORDER BY
    ParentId ASC

接下来,我们需要告诉 MySQL 忽略外键约束,以便我们可以正确更新我们的值。我们将使用这个语法:

SET foreign_key_checks = 0;

这会导致 MySQL 在更新值时忽略外键检查,但它仍然会强制使用正确的值类型(请参阅MySQL 参考了解详情)。

接下来,我们需要使用新值更新父表和子表。为此,我们将使用以下 UPDATE 语句:

UPDATE
    Parent,
    Child,
    NewIds
SET
    Parent.ParentId = NewIds.Id,
    Child.ParentId = NewIds.Id
WHERE
    Parent.ParentId = NewIds.ParentId AND
    Child.ParentId = NewIds.ParentId

现在,我们已将所有 ParentId 值正确更新为临时表中新的有序 Id。完成后,我们可以重新进行外键检查以保持引用完整性:

SET foreign_key_checks = 1;

最后,我们将删除临时表来清理资源:

DROP TABLE NewIds

就是这样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何填补自增字段的“洞”? 的相关文章

  • 导入 CSV 以更新表中的行

    大约有 26K 个产品 帖子 每个产品都有如下元值 post id 列是数据库中的产品 ID sku meta key 是每个产品的唯一 ID 我收到了一个新的 CSV 文件 该文件更新了每个产品的 sale price meta key
  • 解码Json数据数组并插入到mysql

    这个问题可能已经在这里问过 但我尝试搜索找不到它 我有如下 Json 数据 CityInfo CityCode 5599 Name DRUSKININKAI CityCode 2003 Name KAUNAS CityCode 2573 N
  • MySQL获取最后10条记录中的第一条记录

    在Mysql中 我试图获取最后10条记录中最旧的记录 为了得到最后 10 个我会简单地做SELECT FROM table ORDER BY id DESC LIMIT 10 为了获得最旧的 我只需使用 ASC 顺序 我需要首先按 DESC
  • MySQL 错误 1290 (HY000) --secure-file-priv 选项

    我试图在我的脚本中使用以下代码将 MySQL 脚本的结果写入文本文件 SELECT p title p content c name FROM post p LEFT JOIN category c ON p category id c i
  • PDO::commit 之后使用 PDOStatement::rowCount 结果?

    在 MySQL 文档中 有一个关于使用的注释mysql affected rows事务提交后 http php net manual en function mysql affected rows php http php net manu
  • MySQL:你能指定一个随机限制吗?

    有没有办法在 SQL MySQL 中随机化限制数字 我希望能够做的是在查询中获取随机数量的结果以在插入子查询中使用 而无需任何服务器端脚本 我希望能够作为假设说明运行的查询是 SELECT id FROM users ORDER BY RA
  • ER_ACCESS_DENIED_ERROR:用户 ''@'localhost' 的访问被拒绝(使用密码:NO)

    我有这个问题 我已经研究过但无法解决它 我想它与数据库权限有关 但我无法修复它 if error throw error Error ER ACCESS DENIED ERROR Access denied for user localho
  • 如何在 Laravel 中编写联合查询?

    我正在使用 laravel 5 0 并且我有 mysql 查询 SELECT surat masuk id surat surat masuk nomor surat FROM surat masuk WHERE EXISTS SELECT
  • 显示过去 7 天 PHP 的结果

    我想做的是显示过去 30 天的文章 但我现有的代码不断给我一个 mysql fetch assoc 错误 然后追溯到我的查询 这是代码 sql mysql query SELECT FROM table WHERE DATE datetim
  • MySql 查询在选择中将 NULL 替换为空字符串

    如何用空字符串替换 select 中的 NULL 值 输出 NULL 值看起来不太专业 这是非常不寻常的 根据我的语法 我希望它能够工作 我希望能得到一个解释 为什么没有 select CASE prereq WHEN prereq IS
  • 是否可以使用“WHERE”子句来选择SQL语句中的所有记录?

    晚上好 我很好奇是否可以在 SQL 语句中创建一个 WHERE 子句来显示所有记录 下面一些解释 随机 SQL 语句 Java JSP示例 正常情况 String SqlStatement SELECT FROM table example
  • 执行许多插入重复键更新错误:未使用所有参数

    所以我一直在尝试使用 python 2 7 15 使用 mysql connector 执行此查询 但由于某种原因 它似乎不起作用并且总是返回错误 并非所有参数都被使用 表更新有一个主键 即 ID 这是我尝试运行此 SQL 的查询 sql
  • MySQL“选择更新”行为

    根据 MySql 文档 MySql 支持多粒度锁定 MGL case 1 开放航站楼 1 连接到mysql mysql gt start transaction Query OK 0 rows affected 0 00 sec mysql
  • RMySQL fetch - 找不到继承的方法

    使用 RMySQL 我想将数据从数据库加载到 R 中的数据帧中 为此 我使用以下代码 R连接数据库 con lt dbConnect MySQL user root password password dbname prediction h
  • 更新重复密钥上的复合密钥 [重复]

    这个问题在这里已经有答案了 我需要更新新行 如果两者都满足 date dat and empId who 作为复合键 但如果其中之一或两者不同 则插入 sql INSERT INTO history SET endtimestamp now
  • 如何使用 PHP 从 MySQL 检索特定值?

    好吧 我已经厌倦了 过去一周我花了大部分空闲时间试图解决这个问题 我知道 SQL 中的查询已更改 但我无法弄清楚 我能找到的所有其他帖子似乎都已经过时了 如果有人能帮助我 我将非常感激 我想做的就是使用手动输入数据库的唯一 密码 来检索行的
  • 高效插入和更新时检查唯一性

    我的员工表中有 2 列 每列值必须是唯一的 staff code staff name staff id staff code staff name 1 MGT Management 2 IT IT staff 当向表中插入或更新项目时 我
  • 如何使用 PHP 获取列中的所有值?

    我一直在到处寻找这个问题 但仍然找不到解决方案 如何从 mySQL 列中获取所有值并将它们存储在数组中 例如 表名称 客户 列名称 ID 名称 行数 5 我想获取此表中所有 5 个名称的数组 我该如何去做呢 我正在使用 PHP 我试图 SE
  • 如何解决 MySQL innodb 在 TRUNCATE TABLE 上“等待表元数据锁”?

    在 GitLab CI 服务器中运行包含数百个应用程序单元测试的测试套件 运行 10 次测试后 不知怎的 它总是卡在等待 TRUNCATE TABLE 上的表元数据锁上 这是一个拆卸步骤 我知道SHOW ENGINE INNODB STAT
  • 让 Prometheus 发送 SQL 查询

    我正在尝试使用普罗米修斯 https prometheus io 监视我的 MySQL 数据库 但似乎找不到添加 SQL 查询的区域 例如 我想运行一个返回值的 SQL 查询 然后将该值添加到图表中 发送警报 有没有办法让 Promethe

随机推荐

  • JQuery 对象承诺的目的是什么?

    几年来 我一直在处理一个兼职问题 其中一些 DOM 元素用 jquery 加载html函数调用后无法立即访问该函数 该行为有点像在不等待文档就绪事件的情况下执行函数 虽然 html 假设是同步的 这所以答案 还有这个one 建议使用承诺ht
  • 如何在wpf中设置TAborder

    我有一个问题 我制作了一个运行良好的 wpf 应用程序 但是我想设置每个表单的制表符顺序 但我在 Vs2008 Express 版本中没有得到任何制表符顺序 我该如何解决这个问题 有谁可以帮助我吗 提前致谢 沙申克 要使 TabIndex
  • scanf 正在使用未初始化的变量; C [重复]

    这个问题在这里已经有答案了 我确信这里有一个愚蠢的错误 但是我无法弄清楚 这是我的代码的一部分 char moving scanf s moving 当我用 gcc 编译它时 它显示以下内容 newmatrix c 38 7 warning
  • 保留并删除 Newtonsoft.Json 中的尾随零

    我的 C 应用程序中的 Newtonsoft JsonConverter 存在问题 我有带尾随零的小数 转换为 json 后 缺少零 Example input decimal 1 99000 output json 1 99 我有自己的转
  • 创建会话时如何获取IP地址?

    In my grails应用程序 我已经实现了接口HttpSessionListener监听会话创建 如下所示 class MyHttpSessionListener implements HttpSessionListener publi
  • 通过Ajax回调在产品页面显示woocommerce通知

    我正在尝试在产品页面中显示 woocommerce 通知 该通知应通过 ajax 回调函数显示 并由按钮触发 回调工作正常 但没有显示任何通知 这是我的代码 jQuery AJAX document ready function retur
  • mkfifo 导致终端挂起?

    Does mkfifo根本无法与 Cygwin 一起使用 一组简单的命令 例如 mkfifo my pipe echo 1234 gt my pipe 只会导致终端永远停留在光标闪烁的状态 我 做错事 了吗 不 你没有做错任何事either
  • 如何隐藏 PrimeFaces 资源的“ln”和“v”实现/版本相关参数

    我在我的应用程序中使用 primefaces 和 primefaces extensions 对于 css 和 js 文件等每个资源 该资源的 GET 请求中还有一个 ln 和 v 查询参数 如下所示 primefaces extensio
  • 使用 xp_cmdshell 通过 DTEXEC 传递变量 (SQL Server 2008)

    我创建了一个 SSIS 包 将 Excel 文件导入到我的数据库中 我创建了一个变量 我想将其用作 Excel 连接管理器的 Excel 文件路径 我的 SSIS 包中的变量名称是 ExcelSource 它应该代表完整路径 我想最终动态设
  • Flutter:如何在Swiper中完成特定逻辑后显示下一个索引,其中GridView也在Swiper中设置?

    我正在尝试制作一个文字游戏 首先 索引将是白色的 如果用户单击正确的答案 则索引将变为绿色并进入下一个屏幕 并且下一个屏幕中的索引将为白色 再次 如果用户单击不正确的答案 则索引将变为红色 并且不要放开下一页直到用户输入正确答案 我在 Sw
  • 使用 SpongyCastle 的 PKCS#10 客户端证书创建 Https 连接

    The goal 我正在努力实现与客户端证书的通信 步骤 1 创建 PKCS 10 请求 CSR 并将其交给我的服务器进行签名 服务器联系人将 CSR 传递给 CA CA 对其进行签名 并返回 PKCS 7 带有签名的 PKCS 10 和
  • 如何在 Netbeans 中添加 Scala 平台?

    我已经为netbeans安装了一套Scala插件 具体来说 Scala 控制台 项目 运行时库 平台 平台标准 编辑器 调试器项目集成 重构 调试器 核心 和 Rats Packrat 解析器 我还通过 ubuntu aptitude 包管
  • 防止多列布局中的元素碎片

    鉴于此代码 wrapper border 2px solid red padding 10px width 310px height 310px webkit column width 150px webkit column gap 10p
  • PHP 写入文件

    下面是我用来将地图数组 翻译 为 SQL 代码的一些代码 以便在更新游戏地图时可以轻松更新数据库 正如您所看到的 它将 SQL 代码打印到屏幕上 以便我可以复制并粘贴它 随着我的地图变得更大 这将变得效率低下 因为它会因大量输出而使浏览器崩
  • Antlr4:输入不匹配

    这是一个简单的语法测试 我认为很容易解析 但我立即得到 不匹配的输入 并且我无法弄清楚 Antlr 正在寻找什么 输入 include something program TEST1 BLAH BLAH 我的语法 grammar ProgH
  • 从字符串转换日期和/或时间时转换失败

    我有这个查询 set IDENTITY INSERT dbo OtherData1 ON INSERT INTO OtherData1 OtherDataID EmployeeID OtherDate OType OSubject Stat
  • Sphinx 内联包括

    我想使用 include 函数内联 但只有当我用两行新行与前面的文本分开时 我才能让它实际包含我想要的文件 在有人问之前 我想包含的文件是一个协议号 所以不 它根本不会从新行中受益 我希望能够轻松更改它 以便我可以在文档的多个位置使用它 我
  • Perl 中的 yyyymmddhhmmss 到 YYYY-MM-DD hh:mm:ss?

    在 perl 中将 yyyymmddhhmmss 转换为 YYYY MM DD hh mm ss 并返回的最佳方法是什么 例如 20130218165601 到 2013 02 18 16 56 01 并返回 能https metacpan
  • 颜色树状图根据外部标签向根向上分支,直到标签匹配

    来自问题使用现有列的树状图的颜色分支 我可以为树状图叶子附近的分支着色 代码 x lt 1 100 dim x lt c 10 10 set seed 1 groups lt c red red red red blue blue blue
  • 如何填补自增字段的“洞”?

    我读过一些关于此的文章 但没有一篇涉及这个问题 我想这是不可能的 但我还是会问 我有一个包含 50 000 多个寄存器的表 这是一个旧表 其中发生了各种插入 删除操作 也就是说 大约 300 个寄存器中存在各种 漏洞 即 1340 1341