Oracle中的約束

     數據的完整性用於確保數據庫數據遵從一定的商業和邏輯規則,在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,性別sex,身份證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,
            sex char(2) default '男' check(sex 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 xxxxxx 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)

             );

發佈了86 篇原創文章 · 獲贊 1 · 訪問量 46萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章