資料完整性
資料庫不僅僅是儲存資料,它也必須保證所儲存的資料的正確性。如果資料不正確或不一致,那麼該資料的完整性可能會遭到破壞,從而給資料庫本身的可靠性帶來意想不到的問題。
為了維護資料庫中的資料完成性,在建立表時通常需要指定一些約束。通過表中的欄位(列)定義約束,就可以防止非法資料的插入問題.對約束的定義可以再create table語句中進行,也可以在alter table語句中進行。
什麼是約束呢?
約束是表級的強制規定.根據約束的作用域,約束又可分為表級約束和列級約束兩種。
列級約束是指是欄位定義的一部分,只能夠應用在一個列上.
表級約束是指獨立於列的定義,可以應用於一個表中的多個列上。
在oracle系統中定義約束時,通過constraint關鍵字為約束命名,如果使用者沒有為約束指定名稱,系統會自動建立預設的名稱。
總結:
作用範圍:列級約束只能作用在一個列上,而表約束可以作用在多個列上(當然表約束也可以作用在一個列上)。
定義方式:列約束必須跟在列的定義裡後面,表約束不與列一起,而是單獨定義。
非空(not null) 約束只能定義在列上
備註:在定義約束時,可以通過指定enable或disable關鍵字將約束的初始狀態設定為啟用或禁用狀態,預設是啟用狀態。
定義約束的語法格式1:
CREATE TABLE [schema.]table
(column datatype [DEFAULT expr]
[column_constraint],
...
[table_constraint][,...]);
列級約束:
column [CONSTRAINT constraint_name] constraint_type,
表級約束
column,...
[CONSTRAINT constraint_name] constraint_type
(column, ...),
約束的分類為:
• NOT NULL
• UNIQUE
• PRIMARY KEY
• FOREIGN KEY
• CHECK
1、 Not null
特點如下:
為欄位定義not null 約束後,該欄位不能為null值
Not Null約束只能在列級定義
在定義一個表中可以有多個not Null
2、 unique
特點如下:
如果為欄位定義了unique約束,該欄位不能夠包含重複值
unique約束既可以在列級定義,也可以在表級定義。
在oracle系統中被定義的unique約束會自動建立一個唯一的索引。
同一個欄位既可以在其上定義為not null 也可以建立unique約束,(為某個欄位可以新增多個約束),注意:如果在一個欄位僅定義了unique約束,則該欄位可以包含多個null值
Unique主要的目的是:是在保證主鍵列外,其它列的唯一性。
3、 primary key
特點如下:
定義為primary key的欄位或欄位組中不能包含重複值,並且不能為null值.(即滿足唯一性,不能為空)
在一個表中只能定義一個primary key的約束
Oracle會自動為具有primarykey約束的欄位新增一個唯一的索引,以及一個not null約束
4、 foreign key
特點如下:
被定義了foreign key約束的欄位的取值只能為相關表中引用的欄位的值或null值。
foreign key約束既可以在列級定義,也可以在表級定義。
定義了foreign key約束的外來鍵欄位和被引用的主鍵欄位可以在同一張表中,這種情況稱為:’自引用’(構成了自關聯關係)
對於同一個欄位可以同時定義為foreign key約束和not null約束。
注意:外來鍵的型別、尺寸等一定要與主鍵完全一致。
備註:
在oracle中級聯刪除有如下三值:
1、 no action 在刪除一方的情況下,對多方不進行任何操作.(不能刪,刪的情況會出現, 違反完整約束條件的異常資訊)
2、 cascade
在刪除一方的時,會把多方所有與1方關聯的資料刪除掉。
3、 set null
在刪除一方的時,會把多方所有與1方關聯的資料的欄位值設定為null(注意:該欄位必須允許為null 否則的話會出現無法更新***為 NULL)。
5、 check
check約束是所有約束中最靈活的約束,也是最複雜的約束,check約束檢查輸入到表中的資料值來維護域的完整性,即檢查輸入的每一個資料,只有符合條件的資料才允許輸入到表中.check約束有如下特點:
在check約束的表示式中,必須引用表中一個或多個欄位,並且表示式的運算結果必須是一個布林值.
Check約束即可以在列級定義,也可以在表級定義
對於同一個欄位可以定義多個check約束,而且對於同一個欄位可以定義check約束和not null約束。
綜合案例:
學生資訊表
使用者名稱,使用者密碼,使用者電話,使用者郵箱,使用者地址.
教師名稱,教師性別,教師職務,教師年齡
——————————————————————————————
分析:滿足1NF正規化(屬性不可再分)
滿足2NF正規化(非主屬性必須完全依賴於任一候選鍵)
使用者名稱->使用者密碼,使用者電話,使用者郵箱,使用者地址.
Stu(sname,stel,semail,saddress)
使用者名稱—> 教師名稱
教師名稱—>使用者名稱
stear(sid,tname,sname)
教師名稱—>教師性別,教師職務,教師年齡
Teacher(tname,tsex,ttitle,tage)
滿足3NF(非主屬性都不傳遞依賴於任一候選鍵)
//建立表的語法同時也給表加約束||或者是建立表之後才用alter語句新增約束條件
//第一步切換到管理員許可權
SQL> conn system/root;
//第二步建立使用者
SQL> create user slj identified by root;
//第三步為使用者分配角色許可權
SQL> grant connect,resource to slj;//connect 連線 resources 建立表的許可權 詳細參考第二次oracle課程
//切換到相應的使用者
SQL> conn slj/root;
//採用create語句建立表
SQL> create table stu(
2 sname varchar2(20) primary key,
3 stel varchar2(11) not null,
4 semail varchar2(40),
5 saddress varchar2(50)
6 );
Table created
SQL> create table teacher(
2 tname varchar2(20) primary key,
3 tsex varchar2(2),
4 ttitle varchar2(40),
5 tage number(3) check(tage<100 and tage>20)
6 );
Table created
SQL> create table stear(
2 sid number(10) primary key,
3 tname varchar2(20) references teacher(tname),
4 sname varchar2(20) references stu(sname)
5 );
Table created
SQL> commit;
//查詢約束條件
SQL> select * from user_constraints;
//查詢被約束的列
SQL> select * from user_cons_columns;
以上內容歸redarmy_chen建立,如需轉載請附帶出處,如有疑問請傳送郵件至redarmy_chen@qq.com