MySQL中欄位定義的NULL, NOT NULL, NOT NULL DEFAULT

執行結果演示以MySQL 8爲準

  • NULL: 可以輸入null, 也可以輸入該欄位定義格式的值
  • NOT NULL: 不可以輸入null, 只能輸入該欄位格式定義的值
  • NOT NULL DEFAULT 'defualt_value': 不可以輸入null, 默認值是defualt_value(DDL語句必須加單引號).

我們來測試一下NOT NULL定義的欄位的執行結果:

  1. 先看 NOT NULL帶DEFUALT的:
CREATE TABLE `test`.`t2`(
    id int unsigned not null auto_increment,
    `gender` varchar(10) NOT NULL DEFAULT '0',
     PRIMARY KEY(`ID`)
) ENGINE=InnoDB;

插入null值:

INSERT INTO `test`.`t2`(id, `gender`)VALUES(1, null);
-- 結果: Error Code: 1048. Column 'gender' cannot be null

執行結果肯定是失敗, 這個與我們預期的一樣.

sql裏面不包含這個NOT NULL的欄位呢?

INSERT INTO `test`.`t2`(`name`)VALUES('aben');

執行結果是插入成功, 但是有warning:

1 row(s) affected, 1 warning(s): 1364 Field 'gender' doesn't have a default value

  1. 有NOT NULL但是不帶DEFAULT的
CREATE TABLE `test`.`t3`(
    id int unsigned not null,
    `gender` varchar(10) NOT NULL,
     PRIMARY KEY(`id`)
) ENGINE=InnoDB;

插入null數據肯定是報錯的, 這點毋庸置疑.

INSERT INTO `test`.`t3`(id,`gender`)VALUES(1,null);
-- 結果: Error Code: 1048. Column 'gender' cannot be null

sql裏面不包含這個NOT NULL的欄位呢?

INSERT INTO `test`.`t3`(id)VALUES(2);

執行結果是插入成功, 但是有warning:

1 row(s) affected, 1 warning(s):  1364 Field 'gender' doesn't have a default value

我們可以看到這個欄位的值是一個 empty string, 這個值與欄位類型有關.

如果NOT NULL的欄位類型換成int, 那就是0了:

CREATE TABLE `test`.`t4`(
    id int unsigned not null,
    `age` int NOT NULL,
     PRIMARY KEY(`id`)
) ENGINE=InnoDB;
INSERT INTO `test`.`t4`(id)VALUES(2);
SELECT * FROM `test`.`t4`;
1 row(s) affected, 1 warning(s):  1364 Field 'gender' doesn't have a default value

MySQL的這個特性, 與我記憶中的SQLServer是不一樣的.

MySQL中null值佔一個bit, 而empty string不佔空間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章