type
status
date
slug
summary
tags
category
icon
password
Handling of Explicit Defaults
在
8.0.13 之前,欄位的預設值只能是常量,但從 8.0.13 版本開始支持使用 expressions(表達式)作為預設值,使用表達式做為預設值時必須要放在括號內,以此來和常量預設值做區分。唯一的例外是
TIMESTAMP 和 DATETIME 使用 CURRENT_TIMESTAMP 作為預設值時,不需要放在括號內,並且在 8.0.13 之前就有支援。此改動也另
BLOB、 TEXT、 GEOMETRY 和 JSON 能夠有預設值(在 8.0.13 之前不允許),但只能是 expressions(表達式),就算只是要使用一個常量作為預設值,也必須要放入括號中。關於
expressions default 有以下規則- 允許使用常量、內置 function(both deterministic and nondeterministic)、operators(運算子)
- 不允許使用子查詢、parameters、variables、stored functions、user-defined functions
- 不能依賴於具有
AUTO_INCREMENT的欄位
- 可以依賴其他欄位,但不可往後引用
generated columns或也同樣有expression default values的欄位。
備註:當
expressions default 中引用 nondeterministic function ,並且將 binlog_format 設置為 STATEMENT 仍會正常執行,但是會記錄到 error log,因為任何 INSERT、UPDATE 操作都將可能導致 MS 不同步。INSERT 新的資料時,可以透過省略欄位名稱或者鍵入
DEFAULT 來使用預設值Handling of Implicit Defaults
若未明確指令預設值,MySQL將根據以下方式決定預設值
- 如果該欄位允許
NULL,則會顯式的加上DEFAULT NULL
- 如果該欄位
NOT NULL,則不會顯示得加上DEFAULT子句
當
INSERT 未提供 NOT NULL 欄位的值時,會根據當下的 sql_mode 處理該欄位- 當啟用嚴格模式(
sql_mode='STRICT_TRANS_TABLES')時,對於支持 transaction 的 table 將會發生錯誤,並且rollback該語句;對於不支持 transaction 的 table 則仍舊會插入錯誤之前的行
- 當未啟用嚴格模式時,則 MySQL 將為欄位提供隱式默認值
隱式默認值的定義如下:
- 對於數字類型的欄位默認值為
0,但AUTO_INCREMENT的欄位默認值為下一個值。
- 對於
TIMESTAMP以外的時間類型默認為相應的零值,TIMESTAMP類型的欄位在 explicit_defaults_for_timestamp 為ON(default 8.0)時有相同的表現,若為OFF(default 5.7)則第一個TIMESTAMP欄位默認為CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。
- 對於
ENUM以外的字串類型默認值為'',ENUM類型默認值為第一個枚舉值。