MySQL 之默認值

本文標識 : MQ0020

本文編輯 : 長安月下賞美人兒

編程工具 : MySQL、DBeaver

閱讀時長 : 6分鐘

前言

關於之前的文章分享,大致同小夥伴兒們共同學習了一些基礎的 MySQL 知識,但是有一些很細碎的內容並未一一指出,故在此進行補充完善。

默認值問題的由來

在一個風和日麗的早晨,小編歡快的進行習題練習,插入了一個資料庫,然後報錯了,#1364 習慣性去網上查原因,於是發現了這個被忽略已久的問題,默認值。莫名發現,它是不聲不響的大俠,如果沒有處理好與它的關係,會死得很有節奏感!

MySQL 嚴格模式與非嚴格模式

小編也是瞪大了狗眼,原來還有不同的模式,也是新奇有趣。

  • MySQL 資料庫嚴格模式 資料庫自身對數據進行嚴格的校驗(格式、長度、類型等),一旦出現不符合需求的數據出現,會直接報錯。
  • MySQL 資料庫非嚴格模式 資料庫自身會容忍開發上的疏忽,譬如 varchar(50),插入了長度 1200 的字元串,就會悄咪咪的取前 50 個,後面的 1150 個會截斷,且也不報錯。

如何開啟MySQL 的嚴格模式

  • 方法一,執行 SQL 語句來開啟
set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
  • 方法二,找到mysql安裝目錄下的 my.ini(windows系統)
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

MySQL 嚴格模式需要注意的小問題

  • 不支援對 not null 欄位插入 null 值
  • 不支援對自增長欄位插 '' 值
  • 不支援 text 欄位有默認值

1、not null 欄位插入 null 值測試

例,插入一條 name 值為 null 的記錄

在非嚴格模式下執行

CREATE TABLE test11 (   id int(11) NOT NULL AUTO_INCREMENT,   name VARCHAR(50),   other TEXT,   PRIMARY KEY (id)  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;    INSERT INTO  test11(other) VALUES('aaaaaaaaaa');

數據結果:

在嚴格模式下執行

CREATE TABLE test00 (   id INT(11) NOT NULL AUTO_INCREMENT,   name VARCHAR(50) NOT NULL,   other TEXT NOT NULL,   PRIMARY KEY (id)  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;    INSERT INTO test00(other) VALUES('aaaaaaaaaa');

數據結果:

2、自增長欄位插入 '' 值測試

例,對 id 欄位插入」值

在非嚴格模式下執行

INSERT INTO test11(id,name,other) VALUES('','','aaaaaa');  Query OK, 1 row affected, 1 warning (0.00 sec)

在嚴格模式下執行

INSERT INTO test00(id,name,other) VALUES('','','bbbbbbb');

數據結果:

3、text 欄位默認值測試

例,創建數據表,設置 text 為默認值 default=''

在非嚴格模式下執行

CREATE TABLE test33 (  id INT(11) NOT NULL AUTO_INCREMENT,  name VARCHAR(50) NOT NULL,  other TEXT NOT NULL DEFAULT'',  PRIMARY KEY (id)  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;    Query OK, 0 rows affected, 1 warning (0.03 sec)

在嚴格模式下執行

CREATE TABLE test44 (  id INT(11) NOT NULL AUTO_INCREMENT,  name VARCHAR(50) NOT NULL,  other TEXT NOT NULL DEFAULT'',  PRIMARY KEY (id)  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

數據結果:

如何設置默認值

  • 數據表中單個欄位
ALTER TABLE 數據表名 MODIFY name VARCHAR (255) DEFAULT NULL;
  • 同一個數據表中多個欄位
#用逗號(,)隔開即可  ALTER TABLE 數據表名  MODIFY name VARCHAR (255) DEFAULT NULL,  MODIFY type INT (11) DEFAULT 0,  MODIFY com_id INT (11) DEFAULT 0,  MODIFY order_id INT (11) DEFAULT 0,  MODIFY farm_id INT (11) DEFAULT 0;

如何刪除默認值

ALTER TABLE 數據表名  ALTER 欄位名1 DROP DEFAULT,  ALTER 欄位名2 DROP DEFAULT;

Tags: