oracle資料完整性

2021-06-19 04:50:26 字數 4182 閱讀 5128

資料完整性

約束,索引,許可權和角色

資料完整性:

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

約束

約束用以確保資料庫資料滿足特地的商業規則。在oracle中,約束包括:

not null :非空

如果在列上定義了not null,那麼插入資料時必須為該列提供資料,否則插不進去。

unique :唯一

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

primary key :主鍵

用於唯一的標識錶行的資料,當定義主鍵約束後,該列不但不能重複而且不能為null

說明:一張表最多只能有乙個主鍵,但是可以有多個unique約束。

聯合主鍵:多列聯合起來作為主鍵。

foreign key :外來鍵

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

建表時,先建主表,再建從表;刪除表時,先刪從表,再刪主表。

check :檢查

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

案例分析

--建立商品表

create table goods(

goodsid char(8) primary key,--主鍵

goodsname varchar2(30),

unitprice number(10,2) check(unitprice>0),--單價大於0

category varchar2(8),

provider varchar2(30) );

--建立客戶表

create table customer(

customerid char(8) primary key, -- 主鍵

name varchar2(50) not null,

address varchar2(50),

email varchar(50) unique --email不能重複

*** char(2) default '男' check (*** in('男','女')),

cardid char(18) );

--購買purchase

create table purchase(

customerid char(8) reference customer(customerid), --外來鍵

goodsid char(8) reference goods(goodsid), --外來鍵

nums number(100) check(nums between 1 and 30) –數量

); 增加約束

如果建表時忘記建立必要的約束,則可以在建表後使用alter table命令為表增加約束。

注意:增加not null約束時,需要使用modify選項,而增加其他4種約束使用add選項。

--增加商品名也不能為空

alter table goods modify goodsname not null;

--增加身份證也不能重複

alter table customer add constraint cardunique unique cardid;

--增加客戶的住址只能是"海淀","朝陽","東城","西城","通州","崇文"

alter table customer add constraint addresschek check(address in (''海淀,'朝陽','東城','西城','通州','崇文'));

刪除約束

alter table 表明 drop constraint 約束名

特別說明:

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

alter table *** drop primary key;

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

alter table *** drop primary key cascade;

顯示約束資訊

1)顯示約束資訊

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

select constraint_name,constraint_type,status,validated from user_constraint where table_name='表名';

2)顯示約束列

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

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

3)更容易的辦法,直接用pl/sql developer檢視即可。

索引 索引定義

索引是用於加速資料訪問的資料物件。合理的使用索引可以大大降低i/o次數,從而提高資料訪問效能。

索引有很多,常用的有幾種。

1)單列索引

單列索引是基於單個列所建的索引,比如:

create index 索引名 on 表名(欄位名);

2)復合索引

復合索引是基於2列或多列的索引。在同一張表上可以有多個索引,但是要求列的組合必須不同,比如:

create index emp_idx1 on emp(ename,job);

create index emp_idx2 on emp(job,name);

索引使用原則

1)在大表上建立索引才有意義

2)在where子句或是連線條件上經常引用的列上建立索引

3)索引的層次不要超過4層

索引的缺點

索引有一些先天不足:

1)建立索引,系統要占用大約為表1.2倍的硬碟和記憶體空間來儲存索引;

2)更新資料的時候,系統必須要有額外的時間來同時對索引進行更新,以維持資料和索引的一致性。

實踐表明,不恰當的索引不但於事無補,反而會降低系統效能。因為大量的索引在進行插入、修改和刪除操作時比沒有索引花費更多的系統時間。

比如在如下字段建立索引是不恰當的:

1)很少或從不引用的字段

2)邏輯的字段,如男女、是否等。

綜上所述,提高查詢效率是以消耗一定的系統資源為代價的,索引不能盲目的建立,這是考驗乙個dba是否優秀的很重要的指標。

其他索引

按照資料儲存方式,可以分為b*樹,反向索引,位圖索引;

按照索引列的個數分類,可以分為單列索引,復合索引;

按照索引列值的唯一性,可以分為唯一索引和非唯一索引;

此外還有函式索引,全域性索引,分割槽索引。

對於索引我們還要說,在不同的情況我們會在不同的列上建立索引,甚至建立不同種類的索引,請記住,技術是死的,人是活的。

比如:b*樹索引建立在重複值很少的列上,而位圖索引建立在重複值很多、不同值相對固定的列上。

顯示索引的資訊

1)顯示表的所有索引

在同一張表上可以有多個索引,通過查詢資料字典檢視dba_indexs和user_indexs可以查詢索引資訊,其中dba_indexs用於顯示資料庫所有的索引資訊,而user_indexs用於顯示當前使用者的索引資訊。

select index_name, index_type from user_indexs where table_name='表名';

2)顯示索引列

通過查詢資料字典檢視user_ind_columns可以顯示索引對應的列的資訊

select table_name,column_name from user_ind_columns where index_name='索引名';

3)亦可以通過pl/sql developer工具檢視。

oracle資料完整性約束

在oracle資料庫中建立表的同時,我們需要給字段新增 約束條件 注意 orcale資料庫中新增約束的條件跟sql server mysql不完全一樣。實體完整性 主鍵 新增主鍵約束 primary key alter table 表名 add constraint 約束名稱 約束型別 關聯列名 a...

Oracle 資料完整性,約束

check約束,檢查約束,實現域完整性 not null約束,非空約束,實現域完整性 primary key,主鍵約束,實現實體完整性,unique key,唯一性約束,實現實體完整性 foreign key,外來鍵約束,實現參照約束 check 約束 alter table goods add c...

MySQL資料完整性(實體完整性 域完整性)

資料完整性 為保證插入到資料庫中的資料是正確的,防止使用者輸入錯誤的資料 分為實體完整性 域完整性 參照完整性 下節再說 1 實體完整性 實體指的是表中的一行,一行記錄對應乙個實體 通過主鍵實現 主鍵 關鍵字 primary key 特點 不能為null,並且唯一。邏輯主鍵 推薦 例如id,不代表實...