【问题标题】:Is it possible to get InnoDB internal row ID?是否可以获得 InnoDB 内部行 ID?
【发布时间】:2014-02-04 15:35:39
【问题描述】:

我有一个没有主键的表。我需要实现某种在线模式更改,并且我不想更改插入顺序。在 MySQL 文档中,我找到了this

如果表没有 PRIMARY KEY 或合适的 UNIQUE 索引,InnoDB 会在内部在包含行 ID 值的合成列上生成隐藏的聚集索引。这些行按 InnoDB 分配给此类表中的行的 ID 排序。行 ID 是一个 6 字节的字段,随着新行的插入而单调增加。因此,按行 ID 排序的行在物理上是按插入顺序排列的。

是否可以从似乎有助于解决我的问题的表中获取此值?

【问题讨论】:

  • 为什么没有主键?
  • 它没有主键提供给我,我想添加它。
  • 您可以随时更改您的表格并包含一个自动递增的 ID。即使它通常对您的代码没有任何“价值”,但您至少可以使用它。
  • 这是一个公平的问题,所以我给了 +1,但实际上你应该像其他人所说的那样添加主键

标签: mysql innodb mysql-5.6


【解决方案1】:

不,没有办法得到这个,因为也没有理由这样做。只要您没有在SELECT(或UPDATEDELETE)中指定ORDER BY 子句,数据库中的行就不会被排序。您应该依赖“插入顺序”。

只需添加一个列作为主键...

【讨论】:

  • 我要做的第一件事是添加主键,但是我不想在添加主键的同时锁定表。我试图找到一种解决方法来防止这种情况。我接受了回答我的问题的答案。
  • 也许以下是你的选择:create table new_table like old_table; insert into new_table select * from old_table; alter table new_table add column id int auto_increment primary key; drop table old_table; rename new_table to old_table; 但请先测试一下,这简直是我的想法......
  • 我决定使用类似的方法: 1. 使用主键创建类似 orig_table 的 temp_table 2. 推迟插入 orig_table 2 分钟 3. 添加后插入触发器到 orig_table 以插入到 temp_table 4. 获取逻辑备份orig_table 的事务隔离级别 REPEATABLE READ 5. 像 temp_table 一样创建 new_table 6. 从逻辑备份恢复到 new_table 7. 将插入到 orig_table 推迟 5 分钟 8. 从 temp_table 插入到 new_table 9. 原子重命名表 orig_table 到 temp_table2 和 new_table 到 orig_table .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多