【CONSTRAINT】具有唯一性約束的列是否可以插入空值

secooler發表於2011-04-16
  請快速的回答這個問題:具有唯一性約束的列是否可以插入空值?

很多朋友看到這個問題後的反應過程一般是這樣的:

第一反應:這個問題實在是太過簡單啦!

進一步地反應:答案為“是”還是“否”呢?有點不太確定!

最後的行動:看看周圍有沒有朋友,不假思索地就問有沒有人知道正確答案!


  這個問題我也被問到過多次!之所以在這裡談到這個“簡單問題”。只是想提醒大家:其實很多情況下僅需簡單動手測試一下,答案將來得更快更直接,印象也會更深!同時也能提高解決和分析問題的能力,何樂而不為呢?

我來記錄一下這個測試過程。

1.建立具有唯一約束的表T
sec@ora10g> create table t (x varchar2(8),constraint uniq_t unique(x));

Table created.

T表僅包含一列X,在X列上建立了唯一約束。

2.測試唯一約束的有效性
sec@ora10g> insert into t values ('secooler');

1 row created.

sec@ora10g> insert into t values ('secooler');
insert into t values ('secooler')
*
ERROR at line 1:
ORA-00001: unique constraint (SEC.UNIQ_T) violated

可見,當插入重複值“secooler”時提示違反了唯一約束條件。

3.驗證是否可以插入空值
嘗試兩種插入方法。
1)使用“null”插入
sec@ora10g> insert into t values (null);

1 row created.

2)使用“''”插入
sec@ora10g> insert into t values ('');

1 row created.

sec@ora10g> commit;

Commit complete.

結論已經非常明顯:具有唯一性約束的列是可以插入空值的!

4.驗證插入後的內容
為了方便檢視插入的空值,這裡使用兩種比較巧妙的方法進行體現。
sec@ora10g> select '>>'||x||'<

'>>'||X||'<<
------------
>>secooler<<
>><<
>><<

sec@ora10g> select nvl(x,'I am NULL value!') from t;

NVL(X,'IAMNULLVA
----------------
secooler
I am NULL value!
I am NULL value!

5.小結
  我一貫主張的是“踐行出真知”。 很多朋友傾向於不加思考和動手便去發問。其實只要能靜下心來實際測試一下,便會獲得很多有趣的知識和快感,時間成本在這裡是微不足道的。如若你太過直接地知道了答案,很多精華也就變成了“情感上的垃圾” !

Good luck.

secooler
11.04.16

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-692682/,如需轉載,請註明出處,否則將追究法律責任。

相關文章