暂无图片
mysql表中从没有任何主键到添加主键的过程是如何的?
我来答
分享
暂无图片 匿名用户
mysql表中从没有任何主键到添加主键的过程是如何的?

mysql表中从没有任何主键到添加主键的过程是如何的?

表中已经有数据了,但是没有任何的主键和索引;


如果添加主键后,底层是如何实现这个过程的?

是不是会做重组之类(底层进行数据移动)

我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
victoryau

大表可能会发生数据重组

暂无图片 评论
暂无图片 有用 8
浮光墨影
在MySQL中,如果一个表已经存在且包含数据,但尚未定义主键,要添加主键时需要考虑以下几个关键点: 1. **选择合适的字段作为主键**: 首先,你需要确定用于作为主键的列或一组列。主键应当是唯一且非空的,通常会选择一个自然标识符(如用户ID、产品ID等)或者创建一个自增序列作为代理键。 2. **添加主键约束**: 使用`ALTER TABLE`语句来为现有表添加主键。例如,假设你决定使用名为`id`的列作为主键,并且该列已经是唯一的且不包含任何NULL值,可以执行以下命令: ```sql ALTER TABLE your_table ADD PRIMARY KEY (id); ``` 3. **处理已有数据**: - 如果你选择的列为唯一且无重复值,则可以直接添加主键。 - 但如果该列原本不是唯一的,或者你想在一个组合的列上设置主键,而这些列的数据组合起来并非都是唯一的,MySQL将无法直接添加主键,因为这违反了主键的唯一性约束。 4. **底层实现过程**: - 当MySQL在已存在数据的表上添加主键时,如果所选列满足唯一性约束,数据库系统会在内部创建索引结构以支持主键查询,这个过程可能涉及到对表数据的重组和索引构建操作,具体取决于表的大小和索引类型。 - 若所选列不满足唯一性约束,MySQL会拒绝添加主键操作,除非你首先清理数据以确保其唯一性,或者选择其他合适的方法来生成新的唯一标识符(如通过`AUTO_INCREMENT`创建新的列)。 5. **数据移动与重组**: - 在某些情况下,特别是对于大表,MySQL在建立索引过程中可能确实需要对数据进行物理排序或移动以符合B树索引或其他索引类型的结构要求。这种操作可能会导致表被锁定,影响到对该表的读写性能,直到索引创建完成。 - 对于InnoDB存储引擎,由于其聚簇索引特性,当第一次给表添加主键时(尤其是当主键是整数类型且没有显式指定自增属性时),表的所有行都会按照新的主键顺序重新排列存储,这是一个比较重的操作,尤其是在大数据量
暂无图片 评论
暂无图片 有用 4
张sir

mysql是索引组织表,整个表的组织形式是按主键的顺序排列的,无主键表添加主键是需要发生表的重组

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏