約束:
用於確保資料庫資料滿足特定的商業規則。
Oracle中的約束包括:
not null:
unique:
primary key: pk
foreign key: fk
check:
a.not null : 非空約束:
如果在列上定義了not null,那麼增加資料時,必須為該列提供資料。
b.unique : 唯一約束:
當定義唯一約束後,該列的值是不能重複的,但是可以為null。比如:社會安全號碼、產品編號、...
c.primary key : 主鍵約束:
用於唯一的標示表行的資料。當定義了主鍵約束後,該列不但不能重複,而且不能為null。
注意:一張表最多隻能由一個主鍵(可以有聯合主鍵),但是可以有多個unique約束。
d.foreign key : 外鍵約束:
用於定義主表和從表之間的關係。外鍵約束要定義在從表上,主表則必須具有主鍵約束或者unique約束。
當定義外鍵約束後,要求外鍵列的資料必須在主表的主鍵列存在或是為null。
e.check : 檢查約束:
用於強制列資料必須滿足條件。
如:假如在sal列上定義了check約束,並要求sal列值在1000--2000之間,那麼在增加資料時,工資少於1000或者大於2000,就會報check約束錯誤。
案例1:商店售貨系統資料表設計案例。
現在一個商務資料庫記錄客戶及其購物情況,由下面三個表組成
a.商業表goods(商品號 goodsId, 商品名 goodsName, 單價unitprice,商品類別 category 供應商provider)
b.客戶表customer(客戶編碼 customerId, 姓名 name, 住址 address, 電郵 email, 性別 sex,身份證 cardId)
c.銷售表 purchase(客戶編碼 customerId,商品編號goodsId,購買數量 nums)
請使用SQL語句建立表,並完成下列功能:
在定義列時,要求聲明:
a.每個表的主外健;
b.客戶的姓名不可為空;
c.單價必須大於0,購買數量必須在1--30之間;
d.電郵不能夠重複;
e.客戶的性別必須是 男 或 女,預設為 男 。
--建立goods表:
create table goods(
goodsid char(8) primary key,--主鍵
goodsName varchar2(30),
unitprice number(10,2) check (unitprice > 0),--檢查約束,單價大於0
category varchar2(8),
provider varchar2(20)
);
--建立customer表:
create table customer(
customerId char(8) primary key,--主鍵
name varchar2(30) not null,--不可為空
address varchar2(50),
email varchar2(30) unique,--唯一約束,不能重複
sex char(2) default '男' check (sex in ('男','女')),
cardId char(18)
);
--建立purchase表:
create table purchase(
customerId char(8) references customer(customerId),
goodsId char(8) references goods(goodsId),
nums number(5) check (nums between 1 and 30) --購買數量必須在1--30之間
);
案例2:
如果在建立表的時候,忘記建立必要的約束,則可以在建立表後使用 alter table 命令來為表增加約束。
注意:增加 not null 約束時,需要使用 modify 選項。
增加其它四種約束時,使用 add 選項。
a.增加 商品名也不可為空;
b.增加 社會安全號碼也不能重複;
c.增加客戶的住址只能是 '武昌區','洪山區','青山區','江漢區'。
a.SQL>alter table goods modify goodsName not null;
b.SQL>alter table customer add connstraint cardunique unique(cardId);
約束 約束名 增加的約束類型
c.SQL>alter table customer add connstraint addresscheck check(address in ('武昌區','洪山區','青山區','江漢區'));