程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle之Check約束實例詳解

Oracle之Check約束實例詳解

編輯:Oracle教程

Oracle之Check約束實例詳解


Oracle | PL/SQL Check約束用法詳解

1. 目標

實例講解在Oracle中如何使用CHECK約束(創建、啟用、禁用和刪除)

2. 什麼是Check約束?

CHECK約束指在表的列中增加額外的限制條件。

注: CHECK約束不能在VIEW中定義。CHECK約束只能定義的列必須包含在所指定的表中。CHECK約束不能包含子查詢。

3. 創建表時定義CHECK約束

3.1 語法:

CREATE TABLE table_name
(
    column1 datatype null/not null,
    column2 datatype null/not null,
    ...
    CONSTRAINT constraint_name CHECK (column_name condition) [DISABLE]
);

其中,DISABLE關鍵之是可選項。如果使用了DISABLE關鍵字,當CHECK約束被創建後,CHECK約束的限制條件不會生效。


3.2 示例1:數值范圍驗證

create table tb_supplier
(
  supplier_id       number,
  supplier_name     varchar2(50),
  contact_name      varchar2(60),
  /*定義CHECK約束,該約束在字段supplier_id被插入或者更新時驗證,當條件不滿足時觸發。*/
  CONSTRAINT check_tb_supplier_id CHECK (supplier_id BETWEEN 100 and 9999)
);

驗證:
在表中插入supplier_id滿足條件和不滿足條件兩種情況:

--supplier_id滿足check約束條件,此條記錄能夠成功插入
insert into tb_supplier values(200, 'dlt','stk');

--supplier_id不滿足check約束條件,此條記錄能夠插入失敗,並提示相關錯誤如下
insert into tb_supplier values(1, 'david louis tian','stk');

不滿足條件的錯誤提示:

Error report -
SQL Error: ORA-02290: check constraint (502351838.CHECK_TB_SUPPLIER_ID) violated
02290. 00000 -  "check constraint (%s.%s) violated"
*Cause:    The values being inserted do not satisfy the named check


3.3 示例2:強制插入列的字母為大寫

create table tb_products
(
  product_id        number not null,
  product_name      varchar2(100) not null,
  supplier_id       number not null,
  /*定義CHECK約束check_tb_products,用途是限制插入的產品名稱必須為大寫字母*/
  CONSTRAINT check_tb_products
  CHECK (product_name = UPPER(product_name))
);

驗證:
在表中插入product_name滿足條件和不滿足條件兩種情況:

--product_name滿足check約束條件,此條記錄能夠成功插入
insert into tb_products values(2, 'LENOVO','2');
--product_name不滿足check約束條件,此條記錄能夠插入失敗,並提示相關錯誤如下
insert into tb_products values(1, 'iPhone','1');

不滿足條件的錯誤提示:

SQL Error: ORA-02290: check constraint (502351838.CHECK_TB_PRODUCTS) violated
02290. 00000 -  "check constraint (%s.%s) violated"
*Cause:    The values being inserted do not satisfy the named check

4. ALTER TABLE定義CHECK約束

4.1 語法

ALTER TABLE table_name
ADD CONSTRAINT constraint_name CHECK (column_name condition) [DISABLE];

其中,DISABLE關鍵之是可選項。如果使用了DISABLE關鍵字,當CHECK約束被創建後,CHECK約束的限制條件不會生效。

4.2 示例准備

drop table tb_supplier;
--創建實例表
create table tb_supplier
(
  supplier_id       number,
  supplier_name     varchar2(50),
  contact_name      varchar2(60)
);

4.3 創建CHECK約束

--創建check約束
alter table tb_supplier
add constraint check_tb_supplier
check (supplier_name IN ('IBM','LENOVO','Microsoft'));

4.4 驗證

--supplier_name滿足check約束條件,此條記錄能夠成功插入
insert into tb_supplier values(1, 'IBM','US');

--supplier_name不滿足check約束條件,此條記錄能夠插入失敗,並提示相關錯誤如下
insert into tb_supplier values(1, 'DELL','HO');
不滿足條件的錯誤提示:
SQL Error: ORA-02290: check constraint (502351838.CHECK_TB_SUPPLIER) violated
02290. 00000 -  "check constraint (%s.%s) violated"
*Cause:    The values being inserted do not satisfy the named check

5. 啟用CHECK約束

5.1 語法

 

ALTER TABLE table_name
ENABLE CONSTRAINT constraint_name;

 

5.2 示例

 

drop table tb_supplier;
--重建表和CHECK約束
create table tb_supplier
(
  supplier_id       number,
  supplier_name     varchar2(50),
  contact_name      varchar2(60),
  /*定義CHECK約束,該約束盡在啟用後生效*/
  CONSTRAINT check_tb_supplier_id CHECK (supplier_id BETWEEN 100 and 9999) DISABLE
);

--啟用約束
ALTER TABLE tb_supplier ENABLE CONSTRAINT check_tb_supplier_id;

 

6. 禁用CHECK約束

 

6.1 語法

 

ALTER TABLE table_name
DISABLE CONSTRAINT constraint_name;

 

6.2 示例

 

--禁用約束
ALTER TABLE tb_supplier DISABLE CONSTRAINT check_tb_supplier_id;

 

7. 約束詳細信息查看
語句:

 

--查看約束的詳細信息
select 
constraint_name,--約束名稱
constraint_type,--約束類型
table_name,--約束所在的表
search_condition,--約束表達式
status--是否啟用
from user_constraints--[all_constraints|dba_constraints]
where constraint_name='CHECK_TB_SUPPLIER_ID';


 

8. 刪除CHECK約束

8.1 語法

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

8.2 示例

ALTER TABLE tb_supplier
DROP CONSTRAINT check_tb_supplier_id;
---------------------------------------------------------------------------------------------------------

如果您們在嘗試的過程中遇到什麼問題或者我的代碼有錯誤的地方,請給予指正,非常感謝!

聯系方式:[email protected]

版權@:轉載請標明出處, 否則追究法律責任!
----------------------------------------------------------------------------------------------------------

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved