[譯] MySQL 數(shù)據(jù)類型的默認(rèn)值

原文地址:https://dev.mysql.com/doc/refman/5.7/en/data-type-defaults.html

在數(shù)據(jù)類型規(guī)范中 DEFAULT value 表示該列的默認(rèn)值。默認(rèn)值必須是常數(shù),不能是一個(gè)函數(shù)或表達(dá)式。 例如,不能將 date 列的默認(rèn)值設(shè)置為函數(shù)的值,如 NOW()CURRENT_DATE唯一例外的是,可以將 CURRENT_TIMESTAMP 指定為 TIMESTAMPDATETIME 類型的默認(rèn)值。 參考 第 12.3.5 節(jié) “Automatic Initialization and Updating for TIMESTAMP and DATETIME”。

BLOB,TEXT,GEOMETRY 和 JSON 列不能設(shè)置默認(rèn)值。

如果在定義列時(shí)沒有顯式指定默認(rèn)值(DEFAULT value),MySQL 將按以下方式設(shè)置默認(rèn)值:

  • 如果一個(gè)列可以將 NULL 作為一個(gè)值,該列就顯式定義為: DEFAULT NULL 。
  • 如果一個(gè)列不能將 NULL 作為一個(gè)值,MySQL 將不對該列顯式定義 DEFAULT 屬性。
    主鍵列屬于特殊情況:如果某一主鍵列沒有顯式定義 NOT NULL,MySQL 將為它設(shè)置 NOT NULL(因?yàn)橹麈I列必須是 NOT NULL) 。在 MySQL 5.7.3 之前,主鍵列會隱式的加入一個(gè)默認(rèn)值定義,為了避免這種情況,應(yīng)該在任何主鍵列的定義中包含一個(gè)顯式 NOT NULL 。

當(dāng)沒有顯示指定默認(rèn)值的列有數(shù)據(jù)插入或變更時(shí),如果 INSERTREPLACE 語句不包含該列的值,或者 UPDATE 語句將該列設(shè)置為 NULL,則 MySQL 將根據(jù)當(dāng)時(shí)的 SQL 模式做處理:

  • 如果啟用 strict 模式,若是事務(wù)表,則會發(fā)生錯(cuò)誤并回滾SQL語句。若是非事務(wù)表,則會發(fā)生錯(cuò)誤,但多行語句執(zhí)行時(shí),錯(cuò)誤行之前的SQL語句會生效。

  • 如果未啟用 strict 模式,則 MySQL 將列設(shè)置為列數(shù)據(jù)類型的隱式默認(rèn)值。

假設(shè)一個(gè)表 t 的定義如下:

CREATE TABLE t (i INT NOT NULL);

上述定義中,i 列沒有顯式的指定默認(rèn)值,因此在 strict 模式下,下面三句SQL都會報(bào)錯(cuò),不會插入數(shù)據(jù)。在非 strict 模式時(shí),只有第三句報(bào)錯(cuò),前兩句會插入隱式默認(rèn)值(因?yàn)?DEFAULT(i) 會報(bào)錯(cuò),不會返回默認(rèn)值):

INSERT INTO t VALUES();
INSERT INTO t VALUES(DEFAULT);
INSERT INTO t VALUES(DEFAULT(i));

參考 Section 6.1.8, “Server SQL Modes”.

可以使用 SHOW CREATE TABLE tablename 語句查看哪些列有 DEFAULT 語句。

隱式默認(rèn)值定義如下:

  • 數(shù)字類型的默認(rèn)值為 0,聲明了 AUTO_INCREMENT 的 integer 和 浮點(diǎn)型字段的默認(rèn)值為下一個(gè)序列值;

  • TIMESTAMP 之外的日期和時(shí)間類型,默認(rèn)值為適當(dāng)“零”值。如果啟用了explicit_defaults_for_timestamp 系統(tǒng)變量,則 TIMESTAMP ,則默認(rèn)值為適當(dāng)?shù)摹傲恪敝担ㄕ垍⒁?第 6.1.5 節(jié) “Server System Variables”)。否則,對于表中的第一個(gè) TIMESTAMP 列,默認(rèn)值為當(dāng)前日期和時(shí)間。請參見 第 12.3 節(jié)“Date and Time Types”。

  • ENUM 之外的字符串類型,默認(rèn)值為空字符串。對于ENUM,默認(rèn)值是第一個(gè)枚舉值。

在 integer 列加 SERIAL DEFAULT VALUE 定義,等價(jià)于 NOT NULL AUTO_INCREMENT UNIQUE 。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,544評論 19 139
  • 什么是數(shù)據(jù)庫? 數(shù)據(jù)庫是存儲數(shù)據(jù)的集合的單獨(dú)的應(yīng)用程序。每個(gè)數(shù)據(jù)庫具有一個(gè)或多個(gè)不同的API,用于創(chuàng)建,訪問,管理...
    chen_000閱讀 4,138評論 0 19
  • 任務(wù)需求:定時(shí)執(zhí)行的任務(wù),調(diào)用存儲過程,進(jìn)行數(shù)據(jù)遷移。 存儲過程相關(guān)總結(jié):(存儲過程的創(chuàng)建 不能伴隨有if exi...
    時(shí)待吾閱讀 3,206評論 0 4
  • MySQL技術(shù)內(nèi)幕:SQL編程 姜承堯 第1章 SQL編程 >> B是由MySQL創(chuàng)始人之一Monty分支的一個(gè)版...
    沉默劍士閱讀 2,635評論 0 3
  • 藍(lán)椅撅著彎彎的腰 陽光溫柔地照耀 承載平凡 亮了藍(lán)椅的側(cè)臉 仙女捧著遙控器 遮住嘴巴 是不想說話 還是害羞
    TJYzzd閱讀 92評論 0 0

友情鏈接更多精彩內(nèi)容