詳解 oracle 五大約束|附設計案例學習

一、維護數據的完整性

數據的完整性用於確保數據庫數據遵從一定的商業和邏輯規則,在oracle中,數據完整性可以使用約束、觸發器、應用程序(過程、函數)三種方法來實現,在這三種方法中,因為約束易於維護,並且具有最好的性能,所以作為維護數據完整性的首選。

詳解 oracle 五大約束|附設計案例學習


二、約束

約束用於確保數據庫數據滿足特定的商業規則。在oracle中,約束包括:not null、 unique, primary key, foreign key和check 五種。

詳解 oracle 五大約束|附設計案例學習

1)、not null(非空)

如果在列上定義了not null,那麼當插入數據時,必須為列提供數據。

2)、unique(唯一)

當定義了唯一約束後,該列值是不能重複的,但是可以為null。

3)、primary key(主鍵)

用於唯一的標示錶行的數據,當定義主鍵約束後,該列不但不能重複而且不能為null。

需要說明的是:一張表最多隻能有一個主鍵,但是可以有多個unqiue約束。

4)、foreign key(外鍵)

用於定義主表和從表之間的關係。外鍵約束要定義在從表上,主表則必須具有主鍵約束或是unique 約束,當定義外鍵約束後,要求外鍵列數據必須在主表的主鍵列存在或是為null。

5)、check

用於強制行數據必須滿足的條件,假定在sal列上定義了check約束,並要求sal列值在1000-2000之間如果不在1000-2000之間就會提示出錯。


三、商店售貨系統表設計案例

現有一個商店的數據庫,記錄客戶及其購物情況,由下面三個表組成:

商品goods(商品號goodsId,商品名goodsName,單價unitprice,商品類別category,供應商provider);

客戶customer(客戶號customerId,姓名name,地址address,電郵email,性別sex,身份證cardId);

購買purchase(客戶號customerId,商品號goodsId,購買數量nums);

請用SQL語言完成下列功能:建表,在定義中要求聲明:

(1). 每個表的主外鍵;

(2). 客戶的姓名不能為空值;

(3). 單價必須大於0,購買數量必須在1到30之間;

(4). 電郵不能夠重複;

(5). 客戶的性別必須是男或者女,默認是男;

SQL> create table goods(
goodsId char(8) primary key, --主鍵
goodsName varchar2(30),
unitprice number(10,2) check(unitprice>0),
category varchar2(8),
provider varchar2(30)
);
SQL> create table customer(
customerId char(8) primary key, --主鍵

name varchar2(50) not null, --不為空
address varchar2(50),
email varchar2(50) unique, --唯一
sex char(2) default '男' check(sex in ('男','女')), -- 一個char能存半個漢字,兩位char能存一個漢字
cardId char(18)
);
SQL> create table purchase(
customerId char(8) references customer(customerId),
goodsId char(8) references goods(goodsId),
nums number(10) check (nums between 1 and 30)
);
表是默認建在SYSTEM表空間的

四、表級定義、列級定義

1)、列級定義

列級定義是在定義列的同時定義約束。

如果在department表定義主鍵約束

create table department4(
dept_id number(12) constraint pk_department primary key,
name varchar2(12),
loc varchar2(12)
);

2)、表級定義

表級定義是指在定義了所有列後,再定義約束。這裡需要注意:

not null約束只能在列級上定義。

以在建立employee2表時定義主鍵約束和外鍵約束為例:

create table employee2(
emp_id number(4),
name varchar2(15),
dept_id number(2),
constraint pk_employee primary key (emp_id),
constraint fk_department foreign key (dept_id) references department4(dept_id)
);

約束是數據庫用來確保數據滿足業務規則的手段,不過在真正的企業開發中,除了主鍵約束這類具有強需求的約束,像外鍵約束,檢查約束更多時候僅僅出現在數據庫設計階段,真實環境卻很少應用,更多是放到程序邏輯中去進行處理。

總之,對於約束的選擇無所謂合不合理,需要根據業務系統對於準確性和性能要求的側重度來決定。

後面會分享更多關於DBA和devops內容,感興趣的朋友可以關注下!

詳解 oracle 五大約束|附設計案例學習


分享到:


相關文章: