首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将表INT值从已签名执行更改为无符号执行

问将表INT值从已签名执行更改为无符号执行
EN

Stack Overflow用户
提问于 2015-12-18 09:27:57
回答 1查看 4.3K关注 0票数 4

我有一个主键为max的表,INT hit,2147483647

假设我想将它切换到无符号,并且表中没有负值,因为它是主键,因为我目前认为它是使表重新运行的最快方法。

ALTER TABLE语句将其转换为无符号INT是否应该是一个相对较快的过程,因为ids的值不应该更改?那锁呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-18 09:52:02

Mysql关于变更表命令的文档在“存储、性能和并发考虑事项”小节中详细描述了这些更改可以快速完成,而无需表复制和索引重建,以及在命令过程中将应用什么锁。不幸的是,没有将更改列类型列为可以执行的操作(当然,请阅读与mysql版本相对应的文档,我刚刚链接了最新版本)。

对于某些操作,不需要临时表的就地ALTER是可能的: 对于没有任何其他选项的ALTER tbl_name重命名为new_tbl_name,MySQL只需重命名任何对应于表tbl_name的文件,而无需复制。(还可以使用RENAME TABLE语句重命名表。见第13.1.28节,“重命名表语法”)任何专门为重命名表授予的特权都不会迁移到新名称。它们必须手动更改。 修改只修改表元数据而不修改表数据的更改是即时的,因为服务器只需要更改表.frm文件,而不需要更改表内容。以下更改是可以以这种方式进行的快速更改:

  • 重命名列。
  • 更改列的默认值。
  • 通过向有效成员值列表的末尾添加新枚举或SET成员来更改ENUM或set列的定义,只要数据类型的存储大小不更改。例如,将一个成员添加到具有8个成员的SET列中,将每个值所需的存储空间从1字节更改为2字节;这将需要一个表副本。在列表中间添加成员将导致对现有成员进行重命名,这需要表副本。
  • 用丢弃改变桌子..。分区..。或者进口..。分区..。TABLESPACE不创建任何临时表或临时分区文件。
  • 带添加分区的ALTER、DROP分区、合并分区、重建分区或重新组织分区不会创建任何临时表(与NDB表一起使用的除外);但是,这些操作可以也确实创建临时分区文件。
  • 范围分区或列表分区的添加或删除操作几乎是即时操作。为散列或键分区添加或合并操作会在所有分区之间复制数据,除非使用线性散列或线性键;这实际上与创建新表相同,尽管添加或合并操作是通过分区执行的。重新组织操作只复制已更改的分区,而不触及未更改的分区。
  • 重命名索引。
  • 为InnoDB添加或删除索引。

锁定:

当ALTER正在执行时,原始表可以被其他会话读取(除了不久就会注意到的例外)。更新并写入在ALTER操作开始后开始的表,直到新表准备就绪,然后自动重定向到新表,而不会发生任何失败的更新。原始表的临时副本在新表的数据库目录中创建。对于将表重命名为不同数据库的ALTER操作,这可能与原始表的数据库目录不同。 前面提到的例外情况是,ALTER块在准备安装新版本的表.frm文件、丢弃旧文件并清除表和表定义缓存中过时的表结构时读取(而不仅仅是写)。此时,它必须获得一个独占锁。为此,它等待当前读取器完成,并阻止新的读取(和写入)。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34352297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档