Henry's Blog

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 語法一次改完。

#database #knex #mysql