天天看點

datetime資料類型_MySQL資料類型 資料類型預設值

資料類型預設值 資料類型規範可以有顯式或隐式的預設值。 資料類型規範中的DEFAULT值子句顯式訓示列的預設值。示例:

datetime資料類型_MySQL資料類型 資料類型預設值

SERIAL DEFAULT VALUE是一種特殊情況。在整數列的定義中,它是NOT NULL AUTO_INCREMENT UNIQUE的别名。 處理顯式DEFAULT子句,某些方面依賴于特定版本,如下所述。 ●MySQL 8.0.13處理顯式預設值 ●MySQL8.0.13之前處理顯式預設值 ●處理隐式預設值 MySQL 8.0.13處理顯式預設值 DEFAULT子句中指定的預設值可以是字面常量或表達式。有一個例外,将表達式預設值括在括号内,以差別于字面常量預設值。示例:

datetime資料類型_MySQL資料類型 資料類型預設值

例外情況是,對于TIMESTAMP和DATETIME列,可以指定CURRENT_TIMESTAMP函數作為預設值,而不需要用括号括起來。 隻有用表達式才能給BLOB、TEXT、GEOMETRY和JSON資料類型配置設定預設值,即使表達式值是字面量: ●這種方式可行(字面量預設值指定為表達式):

datetime資料類型_MySQL資料類型 資料類型預設值

●這種方式将産生錯誤(字面量預設值未指定為表達式):

datetime資料類型_MySQL資料類型 資料類型預設值

表達式預設值必須符合以下規則。如果表達式包含不允許的結構,則會發生錯誤。 ●允許使用字面量、内置函數(确定性函數和非确定性函數)以及運算符。 ●不允許使用子查詢、參數、變量、存儲過程和使用者定義函數。 ●表達式預設值不能依賴于具有AUTO_INCREMENT屬性的列。 ●列的表達式預設值可以引用其他列,但是表達式預設值引用的生成列或具有表達式預設值的列必須是前向引用。 這個順序限制也适用于使用ALTER TABLE語句重新排序表的列。如果結果表的表達式預設值包含對生成的列或具有表達式預設值的列的後向引用,則該語句将失敗。 對于CREATE TABLE ... LIKE 和 CREATE TABLE ... SELECT語句,則目标表将保留原始表中的表達式預設值。 如果表達式預設值引用不确定函數,則導緻表達式計算的任何語句對于基于語句的複制來說都是不安全的。這包括INSERT和UPDATE等語句。在這種情況下,如果禁用了二進制日志記錄,則該語句将正常執行。如果啟用了二進制日志記錄,并且binlog_format設定為STATEMENT,則會記錄并執行該語句,但會在錯誤日志中寫入一條警告消息,因為複制從屬伺服器可能會發生分歧。當binlog_format設定為MIXED或ROW時,語句将正常執行。 插入新行時,可以通過省略列名或将列指定為DEFAULT(就像對于具有字面量預設值的列一樣)來插入具有表達式預設值的列:

datetime資料類型_MySQL資料類型 資料類型預設值

但是,僅允許對具有字面量預設值的列使用DEFAULT(col_name)指定列為預設值,而不允許對具有表達式預設值的列使用。 并非所有存儲引擎都允許表達式預設值。對于不支援的存儲引擎,會引發 ER_UNSUPPORTED_ACTION_ON_DEFAULT_VAL_GENERATED 錯誤。 如果預設值的計算結果與聲明的列類型不同,則會根據通常的MySQL類型轉換規則隐式轉換為聲明的類型。 MySQL8.0.13之前處理顯式預設值 有一個不同情況,DEFAULT子句中指定的預設值必須是字面常量;它不能是函數或表達式。這意味着,不能将日期列的預設值設定為函數的值,例如NOW()或CURRENT_DATE。例外情況是,對于TIMESTAMP和DATETIME列,可以将CURRENT_TIMESTAMP指定為預設值。 無法為BLOB、TEXT、GEOMETRY和JSON資料類型配置設定預設值。 如果預設值的計算結果與聲明的列類型不同,則會根據正常的MySQL類型轉換規則隐式轉換為聲明的類型。 處理隐式預設值 如果一個資料類型規範中沒有顯式的預設值,那麼MySQL會按如下方式确定預設值: 如果列可以接受NULL值,則使用顯式的DEFAULT NULL子句定義該列。 如果列不能接受NULL值,MySQL将不使用顯式DEFAULT子句定義該列。 對于沒有顯式DEFAULT子句的NOT NULL列的資料輸入,如果INSERT或REPLACE語句不包含該列的值,或者UPDATE語句将該列設定為NULL,則MySQL會根據當時有效的SQL模式處理該列: ●如果啟用了嚴格SQL模式,事務表将出錯,語句将復原。對于非事務表,會引發錯誤,但如果多行語句的第二行或後續行發生這種情況,則前面的行将被插入。 ●如果未啟用嚴格模式,MySQL會将列設定為列資料類型的隐式預設值。 假設表t的定義如下:

datetime資料類型_MySQL資料類型 資料類型預設值

在本例中,i沒有顯式預設值,是以在嚴格模式下,下面的每個語句都會産生一個錯誤,并且不會插入任何行。不使用嚴格模式時,隻有第三條語句産生錯誤;前兩條語句插入隐式預設值,但第三條語句失敗,因為DEFAULT(i)無法生成值:

datetime資料類型_MySQL資料類型 資料類型預設值

對于給定的表,SHOW CREATE TABLE語句顯示哪些列具有顯式DEFAULT子句。 隐式預設值定義如下: ●對于數值類型,預設值為0,但是有個例外,對于使用AUTO_INCREMENT屬性聲明的整數或浮點類型,預設值是序列中的下一個值。 ●對于TIMESTAMP以外的日期和時間類型,預設值是該類型的适當的"零"值。如果啟用了explicit_defaults_for_timestamp系統變量,則TIMESTAMP類型也是如此。否則,對于表中的第一個TIMESTAMP列,預設值為目前日期和時間。 ●對于ENUM以外的字元串類型,預設值為空字元串。對于ENUM,預設值是第一個枚舉值。 官方文檔: https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html

繼續閱讀