資料的完整性用於確保資料庫資料遵從一定的商業和邏輯規則,在oracle中,資料完整性可以使用約束、觸發器、應用程式(過程、函式)三種方法來實現,在這三種方法中,因為約束易於維護,並且具有最好的效能,所以作為維護資料完整性的首選
但是約束會一定程度上較低資料庫效能,有些規則直接在程式邏輯中處理就可以了,同時,也有可能在面對業務變更或是系統擴充套件時,資料庫約束會使得處理不夠方便
總之,對於約束的選擇無所謂合不合理,需要根據業務系統對於準確性和效能要求的側重度來決定。
資料庫約束有五種:
主鍵約束(primary key)
唯一性約束(unique)
非空約束(not null)
外來鍵約束(foreign key)
檢查約束(check)
not null(非空)
如果在列上定義了not null,那麼當插入資料時,必須為列提供資料
unique(唯一)
當定義了唯一約束後,該列值是不能重複的,但是可以為null
primary key(主鍵)
用於唯一的標示錶行的資料,當定義主鍵約束後,該列不但不能重複而且不能為null
需要說明的是:一張表最多只能有乙個主鍵,但是可以有多個unqiue約束
foreign key(外來鍵)
用於定義主表和從表之間的關係。外來鍵約束要定義在從表上,主表則必須具有主鍵約束或是unique 約束,當定義外來鍵約束後,要求外來鍵列資料必須在主表的主鍵列存在或是為null
check
用於強制行資料必須滿足的條件,假定在sal列上定義了check約束,並要求sal列值在1000-2000之間如果不在1000-2000之間就會提示出錯。
sql> create table
goods(
goodsid char(8) primary key, //主鍵
goodsname varchar2(30),
unitprice number(10,2)
check(unitprice>0),
category varchar2(8),
provider varchar2(30)
);
sql> create table customer(
customerid char(8) primary key, //主鍵
name varchar2(50) not null, //不為空
address varchar2(50),
email varchar2(50) , //唯一
*** char(2) default
'男' check(*** in ('男','女')), //乙個char能存半個漢字,兩位char能存乙個漢字
cardid char(18)
);
sql> 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表空間的
如果在建表時忘記建立必要的約束,則可以在建表後使用alter table命令為表增加約束。但是要注意:增加not null約束時,需要使用modify選項,而增加其它四種約束使用add選項。
sql> alter table goods modify *** not null;
sql> alter table customer add constraint ***unique();
sql> alter table customer add constraint *** check (address in ());
刪除約束
當不再需要某個約束時,可以刪除。
alter
table 表名 drop
constraint 約束名稱;
特別說明一下:在刪除主鍵約束的時候,可能有錯誤,比如:alter table 表名 drop primary key;這是因為如果在兩張表存在主從關係,那麼在刪除主表的主鍵約束時,必須帶上cascade選項 如像:alter table 表名 drop primary key cascade;
顯示約束資訊
通過查詢資料字典檢視user_constraints,可以顯示當前使用者所有的約束的資訊。
select constraint_name, constraint_type, status, validated from user_constraints where table_name = 『表名』;
顯示約束列
通過查詢資料字典檢視user_cons_columns,可以顯示約束所對應的表列資訊。
select column_name, position from user_cons_columns where constraint_name = 『約束名』;
資料庫約束有兩類狀態
啟用/禁用(enable/disable):是否對新變更的資料啟用約束驗證
驗證/非驗證 (validate/novalidate) :是否對錶中已客觀存在的資料進行約束驗證這兩類四種狀態從語法角度講可以隨意組合,預設是 enable validate
四類組合
enable validate :
預設的約束組合狀態,無法新增違反約束的資料行,資料表中也不能存在違反約束的資料行;
enable novalidate :
無法新增違反約束的資料行,但對已存在的違反約束的資料行不做驗證;
disable validate :
可以新增違反約束的資料行,但對已存在的違反約束的資料行會做約束驗證(從描述中可以看出來,這本來就是一種相互矛盾的約束組合,只不過是語法上支援這種組合罷了,造成的結果就是會導致dml失敗)
disable novalidate :
可以新增違法約束的資料行,對已存在的違反約束的資料行也不做驗證。
我們需要上傳大量違反非空約束的歷史資料,可以臨時將約束狀態轉為 disable novalidate,以保證這些不合要求的資料匯入表中
sql> alter table emp modify constraint emp_ename_nn disable novalidate;
在資料匯入完成之後,再將約束狀態轉為enable novalidate 以確保之後新增的資料不會再違反約束
sql> alter table emp modify constraint emp_ename_nn enable novalidate;
Oracle建立約束 刪除約束
1.定義not null 約束not null 約束只能在列級定義,不能在表級定義 例 create table emp01 eno int not null,name varchar2 10 constraint nn name2 not null,salary number 6,2 2.定義un...
oracle 約束之主鍵約束
1 主鍵約束作用 確保表中每一行資料是唯一的,要求非空且唯一 2 一張表中只能設定乙個主鍵約束 主鍵約束可以由多個字段構成 聯合主鍵或復合主鍵 1 在建立表時設定主鍵約束 建立聯合主鍵 通過user constraints資料字典查詢表中主鍵的名稱 2 修改表時新增主鍵約束 alter table ...
十六 oracle 索引
一 管理索引 原理介紹 索引是用於加速資料訪問的資料物件。合理的使用索引可以大大降低i o次數,從而提高資料訪問效能。索引有很多種我們主要介紹常用的幾種 為什麼新增了索引後,會加快查詢速度呢?二 建立索引 1 單列索引 單列索引是基於單個列所建立的索引 語法 create index 索引名 on ...