CHECK約束中的NULL條件
今天同事在新增約束的時候,意外的新增了一個NULL值約束,導致了約束的失效。
看一個簡單的例子:
SQL> CREATE TABLE T
2 (
3 ID NUMBER,
4 FLAG CHAR(1) NOT NULL,
5 CONSTRAINT CK_FLAG CHECK (FLAG IN ('A'))
6 );
表已建立。
SQL> INSERT INTO T (ID, FLAG) VALUES (1, 'A');
已建立 1 行。
SQL> INSERT INTO T (ID, FLAG) VALUES (1, 'B');
INSERT INTO T (ID, FLAG) VALUES (1, 'B')
*第 1 行出現錯誤:
ORA-02290: 違反檢查約束條件 (YANGTK.CK_FLAG)
SQL> INSERT INTO T (ID, FLAG) VALUES (1, NULL);
INSERT INTO T (ID, FLAG) VALUES (1, NULL)
*第 1 行出現錯誤:
ORA-01400: 無法將 NULL 插入 ("YANGTK"."T"."FLAG")
由於FLAG列上的CHECK約束和NOT NULL約束,會導致除了’A’以外的資料都無法插入。但是如果在約束上新增一個NULL值:
SQL> ALTER TABLE T DROP CONSTRAINT CK_FLAG;
表已更改。
SQL> ALTER TABLE T ADD CONSTRAINT CK_FLAG CHECK (FLAG IN ('A', ''));
表已更改。
Oracle不會檢查同一個列上的多個CHECK約束是否會發生衝突,因此上面新增FLAG IN NULL這個約束並不會報錯。
但是這種新增的NULL,會導致這個CHECK約束失效:
SQL> INSERT INTO T (ID, FLAG) VALUES (1, 'A');
已建立 1 行。
SQL> INSERT INTO T (ID, FLAG) VALUES (1, 'B');
已建立 1 行。
SQL> INSERT INTO T (ID, FLAG) VALUES (1, 'C');
已建立 1 行。
SQL> INSERT INTO T (ID, FLAG) VALUES (1, NULL);
INSERT INTO T (ID, FLAG) VALUES (1, NULL)
*第 1 行出現錯誤:
ORA-01400: 無法將 NULL 插入 ("YANGTK"."T"."FLAG")
現在CHECK約束CK_FLAG已經完全失去作用,對於FLAG列除了NULL值外,其他任何值都可以插入。
CHECK的約束保證插入的資料不會導致CHECK檢查的結果為假,CHECK結果為真和為空的記錄都可以插入。
對於FLAG IN (‘A’, ‘’)的約束而言,任何記錄的CHECK結果不是TRUE就是NULL。因此任何記錄都是可以插入的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-69341/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- 如何在ORACLE中修改表的約束條件啊Oracle
- Oracle唯一約束中NULL的處理OracleNull
- Oracle 9i 約束條件(轉)Oracle
- Oracle外來鍵約束中NULL的處理OracleNull
- MySQL學習筆記之約束條件MySql筆記
- 資料庫的集合,分頁及約束條件資料庫
- 32. 基本資料型別、約束條件資料型別
- not null與check is not nullNull
- TreeSet的null值與元素型別的約束Null型別
- 練習:NICK方案中PurchaseOrder新增CHECK型別的約束,要求ReceivedDate >= PODate型別
- oracle中的約束Oracle
- SQL Server中使用Check約束達到提升效能SQLServer
- NULL和唯一約束UNIQUE的對應關係Null
- not-null約束對執行計劃的影響Null
- [20170516]nvl與非NULL約束.txtNull
- 模擬退火演算法Python程式設計(2)約束條件的處理演算法Python程式設計
- 謂詞條件是is null走索引嗎?Null索引
- ORACLE SQL過濾條件是IS NULL or !=的優化OracleSQLNull優化
- 線上重定義拷貝表結構的NOT NULL約束問題Null
- [20170516]nvl與非NULL約束2.txtNull
- 帶約束條件的運籌規劃問題求解(模擬退火演算法實現)演算法
- SQL中on條件與where條件的區別[轉]SQL
- MySQL 中的約束及相關操作MySql
- Eclipse中引入spring的約束EclipseSpring
- React Native中的約束規範React Native
- MySQL中的 UNIQUE約束和UNIQUE索引MySql索引
- PHP中的型別約束介紹PHP型別
- 10、Oracle中的約 束constraintOracleAI
- Eclipse中引入MyBatis約束EclipseMyBatis
- PHP7 ?? 與 ?: 的作用和區別(null合併運算子, null條件運算子)PHPNull
- 資料庫約束 主鍵-唯一性-Check-外來鍵資料庫
- Javaweb-約束-外來鍵約束JavaWeb
- oracle中的條件語句Oracle
- 【SQL】SQL中if條件的使用SQL
- Oracle定義約束 外來鍵約束Oracle
- where語句中多條件查詢欄位NULL與NOT NULL不確定性查詢Null
- 【機器學習之數學】03 有約束的非線性優化問題——拉格朗日乘子法、KKT條件、投影法機器學習優化