将表INT值从有符号执行到无符号执行

时间:2015-12-18 09:27:58

标签: mysql int

我的表格中包含最高签名INT点击的主键,2147483647

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

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

1 个答案:

答案 0 :(得分:3)

ALTER TABLE命令上的Mysql文档详细描述了“存储,性能和并发注意事项”部分,这些更改可以快速完成,无需表复制和索引重建,以及mysql将在什么时候应用的锁定命令的过程。遗憾的是,未将列类型更改为可以在适当位置执行的操作(当然,请阅读与您的mysql版本相对应的文档,我只是链接了最新版本)。

  

对于某些操作,可能没有就地ALTER TABLE   需要临时表:

     

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

     

仅修改表元数据而非表数据的更改是立即的,因为服务器只需要更改表.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文件的版本,丢弃旧文件,然后清除   表和表定义高速缓存中过时的表结构。   此时,它必须获得独占锁。为此,它等待   当前读者完成,并阻止新的读取(和写入)。