Oracle constraints type 約束型別

kunlunzhiying發表於2017-01-03

一、維護資料的完整性

概述:資料的完整性用於確保資料庫資料遵從一定的商業和邏輯規則。在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));




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28211342/viewspace-2131826/,如需轉載,請註明出處,否則將追究法律責任。

相關文章