oracle資料庫定義了五種約束:
1、 not null 非空約束,定義列不能為空。此定義只能在列級定義。
2、unique 唯一約束,表中的每一行所定義的列或列值不能相同。
3、primary key 主鍵約束,主鍵(primary key)是表中的**乙個或多個字段,它的值**_ 用於唯一地標識表中的某一條記錄_。
4、foreign key 就是表與表之間的某種約定的關係,由於這種關係的存在,能夠讓表與表之間的資料,更加的完整,關連性更強。foreign key外來鍵約束是一列或多列的組合, 其定義必須和父表的父鍵保持一致。每乙個非空的foreign key都必須在父表的父鍵裡面找到對應的值。
5、check 條件約束可以應用於乙個或者多個列,也可以將多個check 約束應用於乙個列。當除去某個表時,對這個表的check 約束也將同時被去除。
主外來鍵的關係:
1. 在預設的oracle外來鍵配置條件下,只要有子表記錄存在,主表記錄是不允許修改或者刪除的。子表記錄也必須時刻保證參照完整性。(簡單解釋就是主鍵存在外來鍵約束,不能隨意刪改主鍵的值,也不能隨意將外來鍵修改為主鍵中沒有的值)。
2.通常使用 這兩個資料字典查詢表的約束和行的約束資訊
** user_constraints: 記錄了表的約束資訊
user_cons_columns:記錄了列的約束資訊
注意:約束的定義分為:
1. 列級定義,只引用乙個列,表中可以有多個列級約束。2.表級定義,引用乙個或者多個列,通常用來定義主鍵。3.追加定義,建表後,再通過alter table 命令追加約束。
列級定義
creater table
a1(id number(2) unique );
表級定義
create
table a1(id number(2),constraint constraintname unique(id,columns....));
追加定義
alter
table tablename add
constraint constraintname unique;
列級定義
number(2) not null);
表級定義
無。 追加定義
alter
table tablename modify dname not
null;
建立表的時候定義
create
table t1(id number(2),name varchar2(3)
constraint check_name check(name in('nan','nv')));
追加check約束
alter
table tablename add
constraint contraintname check( 約束條件 )[disable];
* disable 是可選項,使用了disable關鍵字,表示約束被建立後,check約束不會生效。*
啟動check約束
alter
table
table-name enable constraint constaint_name;
禁用check約束
alter
table table_name disable constraint constraint_name;
刪除check約束
alter
table table_name drop
constraint constraint_name;
檢視check狀態例子:
** –檢視約束的詳細資訊
select
constraint_name,–約束名稱
constraint_type,–約束型別
table_name,–約束所在的表
search_condition,–約束表示式
status–是否啟用
from user_constraints–[all_constraints|dba_constraints]
where constraint_name=』check_tb_supplier_id』;
**列級定義
create
table t1(id number(2) primary
key,name varchar2(20));
表級定義
creater table
t1(id number(2),name varchar2(20) constraint pk_name primary key(id));
追加定義(單列主鍵)
alter
table table_name add
constraint pk primary
key(id);
多列主鍵
alter
table table_name add
constraint pk primary
key(id,name);
禁用check約束
alter
table table_name disable constraint constraint_name;
啟動check約束
alter
table
table-name enable constraint constaint_name;
刪除check約束
alter
table table_name drop
constraint constraint_name;
主鍵指能唯一標識一條記錄的單個資料表列或聯合的資料表列(聯合主鍵|復合主鍵)。主鍵用到的資料表列資料不能包含空值。而且,一張表只能包含乙個主鍵。(主鍵建立時自建索引)
在oracle資料庫中,聯合主鍵的列不能超過32個。主鍵可以在建立表時定義或者通過alter table語法定義。
外來鍵是該表是另乙個表之間聯接的字段
外來鍵必須為另乙個表中的主鍵
外來鍵的用途是確保資料的完整性。它通常包括以下幾種:
實體完整性,確保每個實體是唯一的(通過主鍵來實施)
域完整性,確保屬性值只從一套特定可選的集合裡選擇
關聯完整性,確保每個外來鍵或是null(如果允許的話)或含有與相關主鍵值相配的值
建立表的時候定義外來鍵:
create table table_name (id number(2),name varchar2(20) constraint fk_colum foreign key (column1,column2,...) references parent_tab(column1,column2.....column_n));
基於多列的外來鍵
略 追加定義外來鍵
alter
table table_name add
constraint constraint_name foreign
key (column1,column2,.......column_n) references parent_table(column1,column2,......column_n) on
delete
cascade;
**
on delete cascade 使用詳細解釋
****
「級聯刪除」,對開發人員來講是一種方便的策略,可以直接「無視」子記錄而刪掉主記錄。但是,一般情況下,資料庫設計人員和dba一般都不推薦這樣的策略。
究其原因,還是由於系統業務規則而定。on delete cascade的確在一定程度上很方便,但是這種自動操作在一些業務系統中是可能存在風險的。例如:乙個系統中存在乙個引數引用關係,這個引數被引用到諸如合同的主記錄中。按照業務規則,如果這個引數被引用過,就不應當被刪除。如果我們設定了on delete cascade外來鍵,連帶的合同記錄就自動的被「乾掉」了。開發引數模組的同事一般情況下,也沒有足夠的「覺悟」去做手工判定。基於這個因素,我們推薦採用預設的強約束關聯,起碼不會引起資料丟失的情況。
** on delete set null :
除了直接刪除記錄,oracle還提供了一種保留子表記錄的策略。注意:外來鍵約束本身不限制欄位為空的問題。如果乙個外來鍵被設定為on delete set null,當刪除主表記錄的時候,無論是否存在子表對應記錄,主表記錄都會被刪除,子表對應列被清空。
語法:
alter
table table_name add contraint contraint_name forgin key(colnum) references prim(colnum) on
delete
setnull;
簡單說就是將主表的主鍵刪除後外來鍵相對的列被設定為null,此列不能新增約束為not null。
oracle外來鍵是我們日常比較常見的約束型別。在很多專家和業界人員的討論中,我們經常聽到「使用外來鍵還是系統編碼」的爭論。支援外來鍵策略的一般都是資料庫專家和「大撒把」的設計師,借助資料庫天然的特性,可以高效實現功能。支援系統編碼的人員大都是「物件派」等新派人員,相信可以借助系統前端解決所有問題。
筆者對外鍵的觀點是「適度外來鍵,雙重驗證」。外來鍵要設計在最緊密的引用關係中,對驗證動作,前端和資料庫端都要進行操作。外來鍵雖然可以保證最後安全渠道,但是不能將正確易於接受的資訊反饋到前端。前端開發雖然比較直觀,但是的確消耗精力。所以,把握適度是重要的出發點。
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...
完整性約束
create table student tb id int notnull 非空約束 資料不允許為空 name varchar 255 null 顯式指定允許為空 新增非空約束 alter table 表名 modify column 屬性名 屬性型別 not null alter table s...