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
類型默認值為第一個枚舉值
。