就是字段不能取空值,比如學(xué)生表的學(xué)號(hào),姓名等字段

目前創(chuàng)新互聯(lián)已為上千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、綿陽服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、孫吳網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
用not null 來約束
這很正常啊,比如一張單據(jù)記錄,有單據(jù)號(hào),有開票日期,有開票人等字段,任何一條屬性都是極其重要的,在查看明細(xì)的時(shí)候不允許任何一條為空,這個(gè)很常見的,沒什么奇怪的
NULL 對(duì)外部程序來說,具體為不知道、不確切的、無法表述的值。所以在很多家公司的開發(fā)規(guī)范里都明確規(guī)定了,必須為 NOT NULL。
其實(shí)用到 NULL 的場景都可以轉(zhuǎn)換為有意義的字符或者數(shù)值,一是有利用數(shù)據(jù)的易讀性以及后期的易維護(hù)性;二是降低 SQL 語句的編寫難度。
關(guān)于 NULL 的特性如下:
1. 參與 NULL 字段拼接的結(jié)果都為 NULL,預(yù)期的可能會(huì)有差異
預(yù)想把字段 r1 做個(gè)拼接,再插入到新的表 t3 里,結(jié)果 t3 表的記錄全為 NULL,跟預(yù)期不符。
mysql show create table t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`r1` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql show create table t2\G
*************************** 1. row ***************************
Table: t2
Create Table: CREATE TABLE `t2` (
`r1` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql create table t3 like t1
Query OK, 0 rows affected (0.04 sec)
mysql insert into t3 select concat(r1,'database') from t1 limit 2;
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql select * from t3;
+------+
| r1 |
+------+
| NULL |
| NULL |
+------+
2 rows in set (0.00 sec)
那正確的方法如下,對(duì) NULL 用函數(shù) IFNULL 特殊處理。
mysql insert into t3 select concat(ifnull(r1,''),'database') from t1 limit 2;
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql select * from t3;
+----------+
| r1 |
+----------+
| database |
| database |
+----------+
2 rows in set (0.00 sec)
2. 對(duì)于包含 NULL 列的求 COUNT 值也不準(zhǔn)確
t1 和 t2 的記錄數(shù)是一樣的,但是字段 r1 包含了 NULL,這導(dǎo)致結(jié)果忽略了這些值。
mysql select count(r1) as rc from t1;
+-------+
| rc |
+-------+
| 16384 |
+-------+
1 row in set (0.01 sec)
mysql select count(r1) as rc from t2;
+-------+
| rc |
+-------+
| 32768 |
+-------+
1 row in set (0.03 sec)
這時(shí)候我們可能想到了,正確的方法是用 NULL 相關(guān)函數(shù)處理,
mysql select count(ifnull(r1,'')) as rc from t1;
+-------+
| rc |
+-------+
| 32768 |
+-------+
1 row in set (0.03 sec)
或者是直接用 COUNT(*) 包含了所有可能的值
mysql select count(*) as rc from t1;
+-------+
| rc |
+-------+
| 32768 |
+-------+
1 row in set (0.02 sec)
當(dāng)然了不僅僅是 COUNT,除了 NULL 相關(guān)的函數(shù),大部分對(duì) NULL 處理都不友好。
所以其實(shí)從上面兩點(diǎn)來看,NULL 的處理都得特殊處理,額外增加了編寫 SQL 的難度。
3. 包含 NULL 的索引列
對(duì)包含 NULL 列建立索引,比不包含的 NULL 的字段,要多占用一個(gè) BIT 位來存儲(chǔ)。
示例
key_len 分別為 43 和 42,t1 比 t2 多了一個(gè)字節(jié),那這里可能有人要問了,不是說占了一個(gè) BIT 位嗎?那為什么多了一個(gè)字節(jié)?可以關(guān)注我上一篇文章(第02期:MySQL 數(shù)據(jù)類型的藝術(shù) - 大對(duì)象字段)關(guān)于 BIT 的詳細(xì)描述。
mysql pager grep -i 'key_len'
PAGER set to 'grep -i 'key_len''
mysql explain select * from t1 where r1 = ''\G
key_len: 43
1 row in set, 1 warning (0.00 sec)
mysql explain select * from t2 where r1 = ''\G
key_len: 42
1 row in set, 1 warning (0.00 sec)
4. 各存儲(chǔ)引擎相關(guān)的對(duì) NULL 的處理
在 MySQL 8.0 發(fā)布后,僅有 InnoDB、MyISAM 和 Memory 支持對(duì)包含 NULL 列的索引,其他引擎不支持。比如 NDB。
空值是一種特殊的狀態(tài), 表示某一個(gè)字段"沒有被處理過"
幾乎在所有的數(shù)據(jù)庫中甚至是編程語言中, 空與非空都有其存在的意義, 舉個(gè)例子, 一個(gè)人員表中, 有一個(gè)年齡字段, 這個(gè)年齡字段如果為非 空, 則在不知道人員年齡的情況下, 數(shù)據(jù)無法入庫, 否則會(huì)顯示個(gè)奇怪的年齡(比如0歲, 或者-1歲等)
而有些情況澤不可以為空, 最常見的就是"主鍵", 比如身份證號(hào)之類的
不知道你為啥要這么問,沒有數(shù)據(jù)當(dāng)然可以這么設(shè)置了,如果有數(shù)據(jù)且設(shè)置列為空時(shí),你設(shè)置非常,會(huì)提示設(shè)置不了,但沒有數(shù)據(jù)的情況下,肯定是可以這么設(shè)置的。
分享題目:mysql的非空怎么弄,mysql非空怎么表示
網(wǎng)頁鏈接:http://chinadenli.net/article3/dsgigos.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、移動(dòng)網(wǎng)站建設(shè)、軟件開發(fā)、網(wǎng)站策劃、外貿(mào)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)