SQL migration failed
一如往常地執行 npx knex migrate:latest
後跳出錯誤
migration file "20210105140439_change_user_phone_number_to_non_nullable.js" failed
migration failed with error: alter table `User` modify `phone_number` varchar(255) not null default '' - WARN_DATA_TRUNCATED: Data truncated for column 'phone_number' at row 14
錯誤訊息看得一頭霧水,直到問了同事後才知道是因為已存在的資料不符合規範,才會造成 migration 失敗
原因解析
這個 migration file 要做的事情是把現有的欄位 phone_number
從 nullable 改成 non-nullable,並將 default 設為 empty
如果資料庫是空的話就沒有問題,migration 會順利執行。問題就出在目前已經有被建立的資料,而且有些的值還是 null
,造成在跑 migration 的時候會有衝突,而出現錯誤。
解決方法
簡單來說,要把現有的衝突 entry 全部改成 non-nullable value,例如改成 empty,或是一串數字。而改的方法可以一筆一筆慢慢改,也可以寫 SQL 語法一次改完。