Oracle中的約束

2021-05-22 21:55:55 字數 3718 閱讀 1803

資料的完整性用於確保資料庫資料遵從一定的商業和邏輯規則,在oracle中,資料完整性可以使用約束、觸發器、應用程式(過程、函式)三種方法來實現,在這三種方法中,因為約束易於維護,並且具有最好的效能,所以作為維護資料完整性的首選。

1.  約束

約束用於確保資料庫資料滿足特定的商業規則。在oracle中,約束包括:not null、 unique, primary key, foreign key,和check五種。  

(1). not null(非空)

如果在列上定義了not null,那麼當插入資料時,必須為列提供資料。

(2). unique(唯一) 

當定義了唯一約束後,該列值是不能重複的,但是可以為null。

(3). primary key(主鍵)

用於唯一的標示錶行的資料,當定義主鍵約束後,該列不但不能重複而且不能為null。一張表最多只能有乙個主鍵,但是可以有多個unqiue約束。

(4). foreign key(外來鍵)

用於定義主表和從表之間的關係。外來鍵約束要定義在從表上,主表則必須具有主鍵約束或是unique約束,當定義外來鍵約束後,要求外來鍵列資料必須在主表的主鍵列存在或是為null。

(5). check

用於強制行資料必須滿足的條件,假定在sal列上定義了check約束,並要求sal列值在1000-2000之間如果不在1000-2000之間就會提示出錯。

2.  商店售貨系統表設計案例

現有乙個商店的資料庫,記錄客戶及其購物情況,由下面三個表組成。

商品goods(商品號goodsid,商品名 goodsname,單價 unitprice,商品類別category,**商provider); 

客戶customer(客戶號customerid,姓名name,住在address,電郵email,性別***,身份證cardid); 

購買purchase(客戶號customerid,商品號goodsid,購買數量nums);

請用sql語言完成下列功能: 

建表,在定義中要求宣告:

(1). 每個表的主外來鍵;

(2). 客戶的姓名不能為空值;

(3). 單價必須大於0,購買數量必須在1到30之間;

(4). 電郵不能夠重複;

(5). 客戶的性別必須是 男 或者 女,預設是男;

create table goods(goodsid char(8) primary key, --主鍵

goodsname varchar2(30),

unitprice number(10,2) check(unitprice>0),

category varchar2(8),

provider varchar2(30)

); create table customer( customerid char(8) primary key, --主鍵

name varchar2(50) not null,  --不為空

address varchar2(50),

email varchar2(50) unique,

*** char(2) default '男' check(*** in ('男','女')), -- 乙個char能存半個漢字,兩位char能存乙個漢字

cardid char(18)

); create table purchase( customerid char(8) references customer(customerid),

goodsid char(8) references goods(goodsid),

nums number(10) check (nums between 1 and 30)

); 表是預設建在system表空間的。

3.  商店售貨系統表設計案例(2)

如果在建表時忘記建立必要的約束,則可以在建表後使用alter table命令為表增加約束。但是要注意:增加not null約束時,需要使用modify選項,而增加其它四種約束使用add選項。

(1). 增加商品名也不能為空 

alter table goods modify goodsname not null;

(2). 增加身份證也不能重複

alter table customer add constraint ****** unique(cardid);

(3). 增加客戶的住址只能是』海淀』,』朝陽』,』東城』,』西城』,』通州』,』崇文』,』昌平』;

alter table customer add constraint yyyyyy check (address in (』海淀』,』朝陽』,』東城』,』西城』,』通州』,』崇文』,』昌平』));

4.  刪除約束

當不再需要某個約束時,可以刪除。 

alter table 表名 drop constraint 約束名稱;

在刪除主鍵約束的時候,可能有錯誤,比如:

alter table 表名 drop primary key;

這是因為如果在兩張表存在主從關係,那麼在刪除主表的主鍵約束時,必須帶上cascade選項。

alter table 表名 drop primary key cascade;

5.  顯示約束資訊

(1). 顯示約束資訊

通過查詢資料字典檢視user_constraints,可以顯示當前使用者所有的約束的資訊。 

例:select constraint_name, constraint_type, status, validated from user_constraints where table_name = '表名';

(2). 顯示約束列

通過查詢資料字典檢視user_cons_columns,可以顯示約束所對應的表列資訊。 

例:select column_name, position from user_cons_columns where constraint_name = '約束名';

(3). 當然也有更容易的方法,直接用pl/sql developer檢視即可。

6. 表級定義和列級定義

(1). 列級定義 

列級定義是在定義列的同時定義約束。 

例:如果在department表定義主鍵約束 

create table department4(

dept_id number(12) constraint pk_department primary key,

name varchar2(12),

loc varchar2(12)

(2). 表級定義 

表級定義是指在定義了所有列後,再定義約束。這裡需要注意:not null約束只能在列級上定義。 

例:在建立employee2表時定義主鍵約束和外來鍵約束 

create table employee2(

emp_id number(4),

name varchar2(15),

dept_id number(2),

constraint pk_employee primary key (emp_id), 

constraint fk_department foreign key (dept_id) references department4(dept_id)

Oracle中的約束

5中種基本的約束 1.主鍵約束 primary key constraint 2.唯一性約束 unique constraint 3.檢查約束 check constraint 4.預設約束 default constraint 5.外來鍵約束 foreign key constraint 約束的檢...

oracle中的五種約束

1.not null 非空 防止null值進入指定的列,在單列基礎上定義,預設情況下,oracle允許在任何列中有null值.2.check 檢查 檢查在約束中指定的條件是否得到了滿足.3.unique 唯一 保證在指定的列中沒有重複值.在該表中每乙個值或者每一組值都將是唯一的.4.primary ...

Oracle中的建表約束

約束是表一級的限制 如果存在依賴關係,約束可以防止錯誤的刪除資料 約束的型別 not null unique primary key foreign key check 使用者可以自定義約束,也可以使用oracle server的sys cn格式命名約束 約束建立的時機 建立表的時候,同時建立約束 ...