mysql数据类型默认值_MySQL数据类型 - 数据类型默认值
數據類型默認值
數據類型規范可以有顯式或隱式的默認值。
數據類型規范中的DEFAULT值子句顯式指示列的默認值。示例:
SERIAL DEFAULT VALUE是一種特殊情況。在整數列的定義中,它是NOT NULL AUTO_INCREMENT UNIQUE的別名。
處理顯式DEFAULT子句,某些方面依賴于特定版本,如下所述。
●MySQL 8.0.13處理顯式默認值
●MySQL8.0.13之前處理顯式默認值
●處理隱式默認值
MySQL 8.0.13處理顯式默認值
DEFAULT子句中指定的默認值可以是字面常量或表達式。有一個例外,將表達式默認值括在括號內,以區別于字面常量默認值。示例:
例外情況是,對于TIMESTAMP和DATETIME列,可以指定CURRENT_TIMESTAMP函數作為默認值,而不需要用括號括起來。
只有用表達式才能給BLOB、TEXT、GEOMETRY和JSON數據類型分配默認值,即使表達式值是字面量:
●這種方式可行(字面量默認值指定為表達式):
●這種方式將產生錯誤(字面量默認值未指定為表達式):
表達式默認值必須符合以下規則。如果表達式包含不允許的結構,則會發生錯誤。
●允許使用字面量、內置函數(確定性函數和非確定性函數)以及運算符。
●不允許使用子查詢、參數、變量、存儲過程和用戶定義函數。
●表達式默認值不能依賴于具有AUTO_INCREMENT屬性的列。
●列的表達式默認值可以引用其他列,但是表達式默認值引用的生成列或具有表達式默認值的列必須是前向引用。
這個順序約束也適用于使用ALTER TABLE語句重新排序表的列。如果結果表的表達式默認值包含對生成的列或具有表達式默認值的列的后向引用,則該語句將失敗。
對于CREATE TABLE ... LIKE 和 CREATE TABLE ... SELECT語句,則目標表將保留原始表中的表達式默認值。
如果表達式默認值引用不確定函數,則導致表達式計算的任何語句對于基于語句的復制來說都是不安全的。這包括INSERT和UPDATE等語句。在這種情況下,如果禁用了二進制日志記錄,則該語句將正常執行。如果啟用了二進制日志記錄,并且binlog_format設置為STATEMENT,則會記錄并執行該語句,但會在錯誤日志中寫入一條警告消息,因為復制從屬服務器可能會發生分歧。當binlog_format設置為MIXED或ROW時,語句將正常執行。
插入新行時,可以通過省略列名或將列指定為DEFAULT(就像對于具有字面量默認值的列一樣)來插入具有表達式默認值的列:
但是,僅允許對具有字面量默認值的列使用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的定義如下:
在本例中,i沒有顯式默認值,因此在嚴格模式下,下面的每個語句都會產生一個錯誤,并且不會插入任何行。不使用嚴格模式時,只有第三條語句產生錯誤;前兩條語句插入隱式默認值,但第三條語句失敗,因為DEFAULT(i)無法生成值:
對于給定的表,SHOW CREATE TABLE語句顯示哪些列具有顯式DEFAULT子句。
隱式默認值定義如下:
●對于數值類型,默認值為0,但是有個例外,對于使用AUTO_INCREMENT屬性聲明的整數或浮點類型,默認值是序列中的下一個值。
●對于TIMESTAMP以外的日期和時間類型,默認值是該類型的適當的"零"值。如果啟用了explicit_defaults_for_timestamp系統變量,則TIMESTAMP類型也是如此。否則,對于表中的第一個TIMESTAMP列,默認值為當前日期和時間。
●對于ENUM以外的字符串類型,默認值為空字符串。對于ENUM,默認值是第一個枚舉值。
文章來源: blog.51cto.com,作者:數據雜貨鋪,版權歸原作者所有,如需轉載,請聯系作者。
原文鏈接:blog.51cto.com/15023289/2560949
總結
以上是生活随笔為你收集整理的mysql数据类型默认值_MySQL数据类型 - 数据类型默认值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql数据库如何让表单与表单关联共用
- 下一篇: mysql某月按小时统计数据_Mysql