日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle之约束

發(fā)布時(shí)間:2024/4/14 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle之约束 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、維護(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é)

以上是生活随笔為你收集整理的oracle之约束的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。