第 2 部分:何時使用預設值
你可能已經知道,在不可為 null 的欄上設定預設值有助於擺脫那些討厭的「Field 'xyz' doesn't have a default value」錯誤。希望你也意識到,防止發生錯誤訊息本身並不是提供預設值的有效理由。提供預設欄值的原因很多,有些好,有些沒有那麼好。我們在第 1 部分探討了 MySQL 嚴格 SQL 模式的影響,以及如何使用 Navicat for MySQL 15 檢視和設定它。在今天的後續文章中,我們將討論何時使用預設值以及如何選用恰當的預設值。
為何不索性允許 Null 值?
可為 null 的欄不像不可為 null 那樣有相同的問題,那麼為什麼不在所有非索引鍵的欄中都允許 null 值呢?在許多情況下,將不可為 null 約束條件套用於欄的目的是迫使應用程式或系統為欄提供值。有時,不是 null 的欄可能包含稽核資訊,例如使用者 ID 或時間戳記。無論在何種情況下,你都是想要有效的資料,而不僅僅是填充的資料。
這是一個重要的考慮因素,因為它帶出了產生有用的預設值以及前端驗證的重要性。我仍然記得我的第一個 Web 應用程式。它是用於收集使用者的詳細資料,例如姓名、電子郵件和電話號碼。所有這些欄位都是必填的欄位,因此一些聰明的使用者找到了各種避開輸入真實資訊的方法,例如輸入電話號碼 111-111-1111 和「Elmer J. Fudd」之類的名稱。
產生時間戳記
我們已經討論了為什麼值得盡你所能設定自動填充欄位。現在讓我們來看一個產生值的常見例子:稽核時間戳記。
Sakila 範例資料庫中的某些資料表具有 last_update 欄。這些欄是 timestamp 資料類型。其值設定為 MySQL CURRENT_TIMESTAMP 函式的輸出。在Navicat Premium 中(如下圖所示),你可以使用下拉式清單設定預設值:
「預設」值設定為記錄建立時的時間戳記,而勾選「根據目前時間戳記更新」方塊則指示 MySQL 在每次 UPDATE 作業時更新時間戳記。 /p>
哨符值
在RDBMS中,哨符值(Sentinel Value)是具有特殊含義。例如,年齡欄中的值 999 表示它是未知的。我還看到了使用「1900-01-01」作為未知日期的應用程式。哨符值在你要分配「未知」值的情況下很有用,而空值表示「沒有值」。並不是每個人都喜歡哨符值,因為使用資料庫的人員和應用程式必須知道所有哨符值才能正確處理它們。
總結
儘管預設值和哨符值在設計和開發良好的資料庫中有其價值,但在分配值之前值得考慮每個值的用途。僅僅是依靠預設值來避免 null 可能不是一個充分的好理由。