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的兼容。
modify
orchange
去更改數據類型的時候,mysql會嘗試轉化存在的列的值到新的類型中。
注意: 通過change
重命名列
- 自動變更
- 指向舊列的索引
- 外鍵
- 不會自定變更
- 生成的列和分塊的表達式
- 視圖和存儲過程