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