原文地址: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 指定為 TIMESTAMP 和 DATETIME 類型的默認(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í),如果 INSERT 或 REPLACE 語句不包含該列的值,或者 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”。
在 integer 列加 SERIAL DEFAULT VALUE 定義,等價(jià)于 NOT NULL AUTO_INCREMENT UNIQUE 。