背景:
業務發展需要,需要復用歷史的表,並且通過表里面原來一個未使用的字段來區分不同的業務。
於是想到通過default來修改列的默認值:
alter table A modify column biz default 'old' comment '業務標識 old-老業務, new-新業務'
現象:
上線幾天之后,業務反饋舊業務的相關數據查詢不到了。找后台運維查生產數據庫,發現歷史數據的biz字段還是null
原因:
自己在本地mysql數據庫試了下,好像的確是default沒法修改歷史數據為null 的值。這就尷尬了。
看起來add column和modify column在default的語義上處理不一樣,對於add column,會將歷史為null的值刷成default指定的值。而對於modify column,只會對新數據產生影響,歷史數據仍然會保持為null。
總結
1. add column和modify column在default的語義上存在區別,如果想修改大表歷史數據的值,建議給一個新的update語句(不管是add column還是modify column,減少ddl執行的時間)
2. 即使指定了default的值,如果insert的時候強制指定字段的值為null,入庫還是會為null
3. 如果僅僅是修改某一個字段的默認值,可以使用 alter table A alter column c set default 'c';
用這種方式來替換modify,會省去重建表的操作,只修改frm文件,效率會大大提升。