oracle 约束 Oracle 10g学习系列(5)
這篇文章來自網(wǎng)絡,寫的挺好,轉(zhuǎn)過來了。
?維護數(shù)據(jù)的完整性
概述:數(shù)據(jù)的完整性用于確保數(shù)據(jù)庫數(shù)據(jù)遵從一定的商業(yè)和邏輯規(guī)則。在Oracle中,數(shù)據(jù)完整性可以使用約束、觸發(fā)器、應用程序(過程、函數(shù))三種方法來實現(xiàn),在這三種方法中,因為約束易于維護,并且具有最好的性能,所以作為維護數(shù)據(jù)完整性的首選。
1、約束
約束用于確保數(shù)據(jù)庫數(shù)據(jù)滿足特定的商業(yè)規(guī)則。在Oracle中,約束包括:not null、unique、primary key, foreign key和check五種。
A、not null(非空)
如果在列上定義了not null,那么當插入數(shù)據(jù)時,必須為列提供數(shù)據(jù)。
B、unique(唯一)
當定義了唯一約束后,該列值是不能重復的,但是可以為null。
C、primary key(主鍵)
用于唯一的標識表行的數(shù)據(jù),當定義主鍵約束后,該列不但不能重復而且不能為NULL。一張表最多只能有一個主鍵,但是可以由多個unique約束。
D、foreign key(外鍵)
用于定義主表和從表之間的關(guān)系,外鍵約束要定義在從表上,主要則必須具有主鍵約束或是unique約束,當定義外鍵約束后,要求外鍵列數(shù)據(jù)必須在主表的主鍵列存在或是為NULL。
E、check
用于強制行數(shù)據(jù)必須滿足的條件,假定在sal列上定義了check約束,并要求sal列值在1000~2000之間,如果不在1000~2000之間就會提示出錯。
綜合案例:
商品售貨系統(tǒng)表設計案例
現(xiàn)在有一個商店的數(shù)據(jù)庫,記錄客戶及其購物情況,由下面三個表組成:
商品表Goods(商品號GoodsId,商品名GoodName,單價UnitPrice,商品類別Categroy,供應商Provider)
客戶表Customers(客戶號CustomerId,姓名Name,住址Address,電郵Email,性別Gender,***CardId)
銷售表Purchases(客戶號CustomerId,商品號GoodsId,購買數(shù)量Num)
請用SQL語言完成下列功能:
建表,在定義中要求聲明:
(1)每個表的主外鍵。
(2)客戶的姓名不能為空值。
(3)單價必須大于0,購買數(shù)量必須在1~30之間。
(4)電郵不能夠重復。
(5)客戶的性別必須是男或女,默認是男。
CREATE TABLE goods ??
? ( ??
? ? ?goodsid ? CHAR(8) PRIMARY KEY, ??
? ? ?goodname ?VARCHAR2(30), ??
? ? ?unitprice NUMBER(10, 2) CHECK(unitprice>0), ??
? ? ?category ?VARCHAR2(8), ??
? ? ?provider ?VARCHAR2(30) ??
? );
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) ??
? );
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)增加商品名也不能為空
ALTER TABLE goods ?MODIFY goodsid NOT NULL;
(2)增加***也不能重復
ALTER TABLE customers ?ADD CONSTRAINT uq_cardid UNIQUE(cardid);
(3)增加客戶的住址只能是海淀、朝陽、東城、西域
ALTER TABLE customers ?ADD CONSTRAINT ck_address CHECK(address IN ('海淀','朝陽','東城','西域'));?
3、刪除約束
當不再需要某個約束時,可以刪除。
alter table 表名 drop constraint 約束名稱;?
特別說明:
在刪除主鍵約束的時候,可能有錯誤。比如
alter table 表名 drop primary key; ?
這是因為如果在兩表存在主從關(guān)系,那么在刪除主表主鍵約束時,必須帶上cascade選項。
alter table 表名 drop primary key cascade;?
轉(zhuǎn)載于:https://blog.51cto.com/whnba/1596265
總結(jié)
以上是生活随笔為你收集整理的oracle 约束 Oracle 10g学习系列(5)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue DevTools可使用修正方法
- 下一篇: RS232与RS485协议原理及应用