Oracle中的NULL(2、NULL詳解)

說明本篇文章是摘取自如下連接的Blog,但做者的這篇文章也是轉載(很是感謝),我在記錄的時候也有添加本身的思考。 sql

http://blog.csdn.net/wh62592855/article/details/4724186
函數

一、什麼是NULL? 測試

當咱們在不知道具體有什麼數據的時候,也就是數據類型不知道、長度不知道等,未知的數據時。咱們就能夠用NULL,咱們稱它爲空,ORACLE中,含有空值的表列長度爲0; spa

Oracle中容許任何一種數據類型的字段爲空,除了如下兩種狀況: .net

    1)主鍵字段(primary key); code

    2)定義時已經加了NOT NULL限制條件的字段; blog

說明: 排序

    1)NULL等價於沒有任何值、是未知數; 索引

    個人註明:感受說法有些欠妥 ,參考個人下一篇文章; 文檔

    2)NULL與0、空字符串、空格都不一樣;

    個人註明:與0、空格都不一樣,這很好理解;可是與空字符串不一樣,這個就讓我有些費解。在我上一篇文章中有說, 個人經歷彷佛能夠代表Oracle將插入字段值爲空字符串解析成了NULL(該字段成了NULL)。但這是否是就認爲Oracle中的NULL與空字符串相同呢?我以爲應該不能這樣認爲......

    3)對空值作加、減、乘、除等運算操做,結果認爲空;

    4)NULL處理用NVL函數;

    5)比較時關鍵字用"IS NULL" 和 "IS NOT NULL";

    6)空值不能被索引,因此查詢時有些符合條件的數據可能查不出來,COUNT(*)中,用NVL(列明,0);

    個人註明:參考個人下一篇文章;

    7)排序是比其餘數據都大,若是按照升序排列,NULL值老是排在最後面;

二、下面是原做者舉得一個頗有意思的例子

    根據NULL的定義,NULL表示的是未知的,所以兩個NULL比較的結果既不相等,也不不等(更深層的理解能夠參見下篇文章)。根據這個定義,能夠想到多個NULL值的存在應該不違反惟一約束。實際上Oracle也是如此實現的:
    在上篇文章已經創建的表中添加以下約束:

ALTER TABLE Z_TEST ADD UNIQUE(FSTUDENTID);
ALTER TABLE Z_TEST ADD UNIQUE(Z_TEST.FSTUDENTID);  --此條語句出錯,不能這樣寫
    往表裏插數據:

INSERT INTO z_test VALUES('007', '愛玲童'); --出錯,由於表中已經有了007記錄
INSERT INTO z_test VALUES(NULL, '木木');   --正確
INSERT INTO z_test VALUES(NULL, '木木');   --正確
INSERT INTO z_test VALUES(NULL, '李力');   --正確

    表數據結果:

    可是當惟一約束爲複合字段時,則狀況發生了變化。根據Oracle文檔的描述,對於複合字段的惟一約束,不爲空字段的值是不能重複的。也就是說,若是兩個字段構成了一個惟一約束,其中一個字段爲空,那麼另外一個字段的值不能出現重複。

ALTER TABLE Z_TEST ADD UNIQUE(FSTUDENTID, FSTUDENTNAME);
INSERT INTO Z_TEST VALUES (NULL, NULL);   --正確
INSERT INTO Z_TEST VALUES (NULL, NULL);   --正確
INSERT INTO Z_TEST VALUES ('007', NULL);  --正確
INSERT INTO Z_TEST VALUES ('007', NULL);  --正確
    表數據結果:


    我測試的結果和原做者描述的徹底不同。

    按照做者的說法,我上面的最後兩條記錄,在插入時是會報錯的。做者解釋:對於所有爲NULL的狀況,仍然和單字段惟一的約束同樣,不會形成重複,可是對於部分NULL的狀況,只要其中不爲NULL的部分發生了重複,Oracle就認爲約束髮生了重複。而這彷佛和NULL的定義有所衝突。因爲Oracle的惟一約束是依賴索引實現的,而Oracle的BTREE索引又是不存儲NULL值的,因此鍵值所有爲NULL的記錄不會記錄在索引中,於是就不會違反惟一約束了,而對於部分爲NULL的記錄,索引是要記錄數值的,所以一旦鍵值中非NULL部分發生了衝突,Oracle就認爲違反了惟一約束。Oracle在這裏仍是選擇了本身方便的方法來實現,而沒有徹底真正的根據NULL的定義去實現惟一約束。

    但是我測得結果就不是這樣的,個人Oracle版本是:Oracle10g~~~~~~

三、Oracle中NULL與空字符串的關聯

    原做者剩餘的篇幅就是和我上篇文章差很少的,感受Oracle就是把空字符串''當作NULL在處理,但是在判斷的時候不能用='',而須要用IS NULL或者是 IS NOT NULL。

總結:在第一做者的描述中,我看到了他關於第2條相關數據的測試,多是因爲Oracle版本的不一樣,同窗們在用的時候最好仍是親自測試一下,要保持懷疑的態度。

相關文章
相關標籤/搜索