将表 INT 值从有符号执行更改为无符号执行

Pau*_*ley 3 mysql int

我有一个主键为最大签名INT命中的表,2147483647

想象一下,我想将它切换为无符号,并且表中没有负值,因为它是主键,因为我目前认为这是让表再次运行的最快方法。

将ALTER TABLE其切换为无符号的语句是否应该INT是一个相对较快的过程,因为 id 的值不应该改变?锁怎么办?

Sha*_*dow 5

关于ALTER TABLE命令的Mysql 文档在“存储、性能和并发性注意事项”部分中以非常详细的方式描述了哪些更改可以快速完成,无需表复制和索引重建,以及在命令过程中 mysql 将应用哪些锁。不幸的是,更改列类型并未列为可以就地完成的事情(当然,请阅读与您的 mysql 版本相对应的文档,我只是链接了最新的)。

对于某些操作,不需要临时表的就地 ALTER TABLE 是可能的:

对于没有任何其他选项的 ALTER TABLE tbl_name RENAME TO new_tbl_name,MySQL 只需重命名与表 tbl_name 对应的任何文件,而不进行复制。(您也可以使用 RENAME TABLE 语句重命名表。请参阅第 13.1.28 节,“RENAME TABLE 语法”。)专门为重命名的表授予的任何权限都不会迁移到新名称。它们必须手动更改。

只修改表元数据而不修改表数据的更改是即时的,因为服务器只需要更改表 .frm 文件,而不是修改表内容。以下更改是可以通过这种方式进行的快速更改:

  • 重命名列。

  • 更改列的默认值。

  • 通过在有效成员值列表的末尾添加新的枚举或集合成员来更改 ENUM 或 SET 列的定义,只要数据类型的存储大小不改变。例如,向具有 8 个成员的 SET 列添加成员会将每个值所需的存储空间从 1 个字节更改为 2 个字节;这将需要一个表格副本。在列表中间添加成员会导致现有成员重新编号,这需要表副本。

  • ALTER TABLE with DISCARD ... PARTITION ... TABLESPACE 或 IMPORT ... PARTITION ... TABLESPACE 不创建任何临时表或临时分区文件。

  • ALTER TABLE with ADD PARTITION、DROP PARTITION、COALESCE PARTITION、REBUILD PARTITION 或 REORGANIZE PARTITION 不会创建任何临时表(除非与 NDB 表一起使用);但是,这些操作可以并且确实会创建临时分区文件。

  • RANGE 或 LIST 分区的 ADD 或 DROP 操作是立即操作或几乎如此。HASH 或 KEY 分区的 ADD 或 COALESCE 操作会在所有分区之间复制数据,除非使用了 LINEAR HASH 或 LINEAR KEY;这实际上与创建新表相同,尽管 ADD 或 COALESCE 操作是逐个分区执行的。REORGANIZE 操作仅复制更改的分区,不接触未更改的分区。

  • 重命名索引。

  • 为 InnoDB 添加或删除索引。

锁定:

当 ALTER TABLE 正在执行时,原始表可以被其他会话读取(除了很快指出的例外)。在 ALTER TABLE 操作开始后开始的对表的更新和写入将暂停,直到新表准备好,然后自动重定向到新表,没有任何失败的更新。在新表的数据库目录中创建原始表的临时副本。对于将表重命名为不同数据库的 ALTER TABLE 操作,这可能与原始表的数据库目录不同。

前面提到的例外是 ALTER TABLE 在准备安装表 .frm 文件的新版本时阻止读取(不仅仅是写入),丢弃旧文件,并从表和表中清除过时的表结构定义缓存。此时,它必须获取排他锁。为此,它等待当前读取器完成,并阻止新的读取(和写入)。