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