oracle之约束
一、維護(hù)數(shù)據(jù)的完整性
概述:數(shù)據(jù)的完整性用于確保數(shù)據(jù)庫數(shù)據(jù)遵從一定的商業(yè)和邏輯規(guī)則。在Oracle中,數(shù)據(jù)完整性可以使用約束、觸發(fā)器、應(yīng)用程序(過程、函數(shù))三種方法來實(shí)現(xiàn),在這三種方法中,因?yàn)榧s束易于維護(hù),并且具有最好的性能,所以作為維護(hù)數(shù)據(jù)完整性的首選。
1、約束
約束用于確保數(shù)據(jù)庫數(shù)據(jù)滿足特定的商業(yè)規(guī)則。在Oracle中,約束包括:not null、unique、primary key, foreign key和check五種。
A、not null(非空)
如果在列上定義了not null,那么當(dāng)插入數(shù)據(jù)時(shí),必須為列提供數(shù)據(jù)。
B、unique(唯一)
當(dāng)定義了唯一約束后,該列值是不能重復(fù)的,但是可以為null。
C、primary key(主鍵)
用于唯一的標(biāo)識(shí)表行的數(shù)據(jù),當(dāng)定義主鍵約束后,該列不但不能重復(fù)而且不能為NULL。一張表最多只能有一個(gè)主鍵,但是可以由多個(gè)unique約束。
D、foreign key(外鍵)
用于定義主表和從表之間的關(guān)系,外鍵約束要定義在從表上,主要?jiǎng)t必須具有主鍵約束或是unique約束,當(dāng)定義外鍵約束后,要求外鍵列數(shù)據(jù)必須在主表的主鍵列存在或是為NULL。
E、check
用于強(qiáng)制行數(shù)據(jù)必須滿足的條件,假定在sal列上定義了check約束,并要求sal列值在1000~2000之間,如果不在1000~2000之間就會(huì)提示出錯(cuò)。
綜合案例:
商品售貨系統(tǒng)表設(shè)計(jì)案例
現(xiàn)在有一個(gè)商店的數(shù)據(jù)庫,記錄客戶及其購物情況,由下面三個(gè)表組成:
商品表Goods(商品號(hào)GoodsId,商品名GoodName,單價(jià)UnitPrice,商品類別Categroy,供應(yīng)商Provider)
客戶表Customers(客戶號(hào)CustomerId,姓名Name,住址Address,電郵Email,性別Gender,身份證CardId)
銷售表Purchases(客戶號(hào)CustomerId,商品號(hào)GoodsId,購買數(shù)量Num)
請(qǐng)用SQL語言完成下列功能:
建表,在定義中要求聲明:
(1)每個(gè)表的主外鍵。
(2)客戶的姓名不能為空值。
(3)單價(jià)必須大于0,購買數(shù)量必須在1~30之間。
(4)電郵不能夠重復(fù)。
(5)客戶的性別必須是男或女,默認(rèn)是男。
sql>create table Goods(
GoodsId char(8) primary key ,--主鍵
GoodName varchar2(50),
UnitPrice number(10,2) check(UnitPrice>0),--單價(jià)必須大于0
Category varchar(30),
Provider varchar(100));
sql>create table Customers(
CustomerId char(8) primary key,
Name varchar2(30) not null, --姓名不能為空
Address varchar2(150),
Email varchar2(100) unique,--必須唯一
Gender char(2) default('男') check(Gender in('男','女')),
CardId char(18));
sql>create table Purchases(
CustomerId char(8) references Customers(CustomerId), --外鍵
GoodsId char(8) references Goods(GoodsId),
Num number(10) check(Num between 1 and 30)));
2、添加約束
如果在建表時(shí)忘記建立必要的約束,則可以在建表后使用alter table命令為表增加約束,但是要注意:增加not null約束時(shí),需要使用modify選項(xiàng),而增加其他四種約束使用add選項(xiàng)。
(1)增加商品名也不能為空
sql>alter table Goods modify GoodsId not null;
(2)增加身份證也不能重復(fù)
sql>alter table Customers add constraint UQ_CardId unique(CardId);
(3)增加客戶的住址只能是海淀、朝陽、東城、西域
sql>alter table Customers add constraint CK_Address check(Address in ('海淀','朝陽','東城','西域'));
3、刪除約束
當(dāng)不再需要某個(gè)約束時(shí),可以刪除。
sql>alter table 表名 drop constraint 約束名稱;
特別說明:
在刪除主鍵約束的時(shí)候,可能有錯(cuò)誤。比如
sql> alter table 表名 drop primary key;
這是因?yàn)槿绻趦杀泶嬖谥鲝年P(guān)系,那么在刪除主表主鍵約束時(shí),必須帶上cascade選項(xiàng)。
sql> alter table 表名 drop primary key cascade;
4、顯示約束信息
A、顯示約束信息
通過查詢數(shù)據(jù)字典視圖user_constraints,可以顯示當(dāng)前用戶所有的約束的信息。
sql>select constraint_name,constraint_type,status,validated from user_constraints where table_name='Goods';
B、顯示列約束
通過查詢數(shù)據(jù)字典視圖user_cons_column,可以顯示約束所對(duì)應(yīng)的表列信息。
sql>select column_name,position from user_cons_columns where constraint_name='CK_Address';
6、表級(jí)定義和列級(jí)定義
A、表級(jí)定義
表級(jí)定義是指在定義了所有列后,再定義約束,這里需要注意,not null約束只能在列級(jí)上定義。
案例:
sql> create table Goods(
GoodsId char(8),GoodsName varchar2(50), Category varchar(30),
constraint PK_GoodsId primary key(GoodsId));
B、列級(jí)定義
列級(jí)定義是在定義列的同時(shí)定義約束。
案例:
sql>create table Goods(
GoodsId char(8) constraint PK_GoodsId primary key ,--主鍵
GoodName varchar2(50),
UnitPrice number(10,2) check(UnitPrice>0),--單價(jià)必須大于0
Category varchar(30),
Provider varchar(100));
轉(zhuǎn)載于:https://www.cnblogs.com/Ronger/archive/2011/10/10/2205515.html
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
- 上一篇: 基础命令之cd,mkdir,cp,ls
- 下一篇: 小型车、中型车、大型车、重型车的区分和定