MySQL數據類型 - 數據類型默認值

數據類型默認值html

數據類型規範能夠有顯式或隱式的默認值。mysql

數據類型規範中的DEFAULT值子句顯式指示列的默認值。示例:sql

MySQL數據類型 - 數據類型默認值

SERIAL DEFAULT VALUE是一種特殊狀況。在整數列的定義中,它是NOT NULL AUTO_INCREMENT UNIQUE的別名。安全

處理顯式DEFAULT子句,某些方面依賴於特定版本,以下所述。服務器

●MySQL 8.0.13處理顯式默認值ide

●MySQL8.0.13以前處理顯式默認值函數

●處理隱式默認值日誌

MySQL 8.0.13處理顯式默認值orm

DEFAULT子句中指定的默認值能夠是字面常量或表達式。有一個例外,將表達式默認值括在括號內,以區別於字面常量默認值。示例:htm

例外狀況是,對於TIMESTAMP和DATETIME列,能夠指定CURRENT_TIMESTAMP函數做爲默認值,而不須要用括號括起來。

只有用表達式才能給BLOB、TEXT、GEOMETRY和JSON數據類型分配默認值,即便表達式值是字面量:

●這種方式可行(字面量默認值指定爲表達式):
MySQL數據類型 - 數據類型默認值

●這種方式將產生錯誤(字面量默認值未指定爲表達式):

MySQL數據類型 - 數據類型默認值

表達式默認值必須符合如下規則。若是表達式包含不容許的結構,則會發生錯誤。

●容許使用字面量、內置函數(肯定性函數和非肯定性函數)以及運算符。

●不容許使用子查詢、參數、變量、存儲過程和用戶定義函數。

●表達式默認值不能依賴於具備AUTO_INCREMENT屬性的列。

●列的表達式默認值能夠引用其餘列,可是表達式默認值引用的生成列或具備表達式默認值的列必須是前向引用。

這個順序約束也適用於使用ALTER TABLE語句從新排序表的列。若是結果表的表達式默認值包含對生成的列或具備表達式默認值的列的後向引用,則該語句將失敗。

對於CREATE TABLE ... LIKE 和 CREATE TABLE ... SELECT語句,則目標表將保留原始表中的表達式默認值。

若是表達式默認值引用不肯定函數,則致使表達式計算的任何語句對於基於語句的複製來講都是不安全的。這包括INSERT和UPDATE等語句。在這種狀況下,若是禁用了二進制日誌記錄,則該語句將正常執行。若是啓用了二進制日誌記錄,而且binlog_format設置爲STATEMENT,則會記錄並執行該語句,但會在錯誤日誌中寫入一條警告消息,由於複製從屬服務器可能會發生分歧。當binlog_format設置爲MIXED或ROW時,語句將正常執行。

插入新行時,能夠經過省略列名或將列指定爲DEFAULT(就像對於具備字面量默認值的列同樣)來插入具備表達式默認值的列:
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的定義以下:
MySQL數據類型 - 數據類型默認值

在本例中,i沒有顯式默認值,所以在嚴格模式下,下面的每一個語句都會產生一個錯誤,而且不會插入任何行。不使用嚴格模式時,只有第三條語句產生錯誤;前兩條語句插入隱式默認值,但第三條語句失敗,由於DEFAULT(i)沒法生成值:

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閱讀 9

相關文章
相關標籤/搜索