type
status
date
slug
summary
tags
category
icon
password

Handling of Explicit Defaults

8.0.13 之前,欄位的預設值只能是常量,但從 8.0.13 版本開始支持使用 expressions(表達式)作為預設值,使用表達式做為預設值時必須要放在括號內,以此來和常量預設值做區分。
唯一的例外是 TIMESTAMPDATETIME 使用 CURRENT_TIMESTAMP 作為預設值時,不需要放在括號內,並且在 8.0.13 之前就有支援。
此改動也另 BLOBTEXTGEOMETRYJSON 能夠有預設值(在 8.0.13 之前不允許),但只能是 expressions(表達式),就算只是要使用一個常量作為預設值,也必須要放入括號中。
關於 expressions default 有以下規則
  1. 允許使用常量、內置 function(both deterministic and nondeterministic)、operators(運算子)
  1. 不允許使用子查詢、parameters、variables、stored functionsuser-defined functions
  1. 不能依賴於具有 AUTO_INCREMENT 的欄位
  1. 可以依賴其他欄位,但不可往後引用 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 類型默認值為 第一個枚舉值