MYSQL 5.7 alter table 小記


MYSQL 5.7 alter table 小記

mysql的alter table 本質上是通過創建臨時表,然后將數據copy到臨時表里,之后刪除原來的表,重命名臨時表 去做的alter操作

alter table 這個操作能干啥

  • 創建刪除索引
  • 更改列類型
  • 重命名列或者表本身

重置自增列的起始值

不能設置值為當前DB中已經用到過的最大值。

alter table t21 auto_increment=13;

alter table 的算法

  • COPY
  • INPLACE

算法區別

  • copy 這個操作一行一行的copy數據從原始表到新表, 而且不支持並發DML,但是並發查詢仍然是支持的,默認使用共享鎖(可以並發查詢),也可指定拍他鎖(並發查詢和DML都不支持)
  • inplace 這個操作會避免copy表數據,但是可能會重建表。在數據准備和執行階段會進行行鎖定,通常支持並發DML

mysql默認選擇inplace,如果存儲引擎不支持,就會選中copy。

InnoDB 對於在共享表空間中的表,使用的是COPY進行的alter table。此類會增加表的空間使用量,因為alter完成之后使用的額外空間並不會釋放會操作系統。

使用INPLACE的算法場景包括:

  • alter table的操作被InnoDB online DDL的特性所支持。
  • 重命名表。 mysql會重命名table對應的文件,並不會做copy數據的操作。(per_file_on_table 需要打開)
  • 僅修改表的元數據的操作,包括: rename column,變更列的默認值,不改變數據類型存儲空間的操作
  • 重命名索引
  • 添加或者刪除一個二級索引

並發控制

LOCK= DEFAULT | NONE | SHARED | EXCLUSIVE

  • DEFAULT 最大級別的並發。並發讀和寫 -> 並發讀 -> 排它鎖(依次降級)
  • NONE 並發讀和寫,不支持就報錯
  • SHARED 並發讀,不允許寫。
  • EXCLUSIVE 不允許並發讀和寫。

修改列的三種方式

  • change
    • 能夠重命名列和更改列的定義,或者同時進行
    • 有更多的能力比modify,但是在某些方面會比較慢。 比如: 如果不是重命名的話, change會對列命名兩次
    • 可以通過first/ after 更改列順序
  • modify
    • 能夠改變列定義,但是不能改變列的名稱。
    • 不是重命名的時候比change更加方便
    • 可以通過first/ after 更改列順序
  • alter
    • 用來更改列的默認值

demo

alter table temp_table change name name_new varchar(100);
alter table temp_table change name name varchar(100);
alter table temp_table modify name varchar(200) after id ;
alter table temp_table alter name set default '';

備注:

change是mysql對標准sql的拓展, modify是mysql對oracel的兼容。
modifyor change 去更改數據類型的時候,mysql會嘗試轉化存在的列的值到新的類型中。

注意: 通過change重命名列

  • 自動變更
    • 指向舊列的索引
    • 外鍵
  • 不會自定變更
    • 生成的列和分塊的表達式
    • 視圖和存儲過程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM