資料完整性

2021-08-25 06:30:01 字數 3298 閱讀 6475

[quote][b]更新丟失[/b]:當有兩個寫程序同時修改相同的資料時,往往會出現乙個寫程序做的修改覆蓋了另乙個寫程序的修改。這種情況是完整性問題最常見的型別。互斥鎖的設計就是防範這種問題的出現。

[b]髒讀[/b]:乙個事務修改的資料在提交前被另乙個事務讀取,就會發生髒讀。由於事務提交的修改有可能會被回滾,因而其他事務讀取的這個資料就可能不正確。為了避免讀鎖導致的競爭,許多資料庫都允許髒讀。

[b]不可重複讀[/b]:由於其他事務的修改,可能出現不可重複的讀。例如乙個事務根據某個條件做查詢。當這個事務得到返回結果集之後,但是在這個事務完成之前,另乙個事務修改了資料,使得某些資料不再滿足前乙個事務的查詢條件。如果這個時候前乙個事務重複這乙個查詢操作,那麼他將得到乙個不同的結果集。因而針對最初的結果集所做的修改有可能就無效了。簡言之,根據同樣的條件在同一事務中查詢兩次有可能產生不同的結果。

[b]幻影讀[/b]:這型別的問題也是由於其他事務對資料的修改而導致的。例如,乙個事務根據某個條件做查詢。在前乙個事務得到返回結果集之後,但是在他完成之前,另乙個事務在資料庫中插入了一條資料,並且該條資料符合前乙個事務的選擇條件,如果事務中的第一條sql語句返回了最初滿足選擇條件的行,之後該事務對滿足條件的這些行執行操作,這個操作所涉及到的行與之前查詢到的行不同,這就因為包含了幻影行而導致的。

[/quote]

[b]1資料完整性約束的分類[/b]

1.域完整性。對表字段取值進行約束,提供了乙個給定域的有效入口,包括資料型別、取值範圍、格式、精度等的規定,實現域完整性可以通過「check約束」、foreign約束」、「default約束」、「not null約束」、「規則」等來實施。

2.實體完整性。以表記錄為單位進行約束,規定乙個表中的每一行必須是唯一的。開發者需要指定乙個表中的一列或一組列作為它的主鍵,[color=red]表中的每行必須含有乙個唯一的主鍵[/color]。主鍵首先不能為空值,其次不能與表中已有行的主鍵值相同。可以通過列的identity屬性、主鍵約束、惟一性約束等來實現。

3.參照完整性。參照完整性在關係模式中,實體與實體之間的關聯同樣採用關係模式來描述,通過引用對應實體的關係模式的主碼來表示對應實體之間的關聯。參照完整性約束又稱為引用完整性約束,是指[color=red]兩個表的主碼和外碼的資料要對應一致[/color]。可以通過「外來鍵約束」、「觸發器」、「儲存過程」等來實施。

參照完整性屬於表間規則。對於永久關係的相關表,在更新、插入或刪除記錄時,如果只改其一不改其二,就會影響資料的完整性:例如修改父表中關鍵字值後,子表關鍵字值未做相應改變;刪除父表的某記錄後,子表的相應記錄未刪除,致使這些記錄稱為孤立記錄;對於子表插入的記錄,父表中沒有相應關鍵字值的記錄;等等。對於這些設計表間資料的完整性,統稱為參照完整性。

4. 使用者定義完整性。以上三種資料完整性約束能夠實現資料庫中大部分資料完整性,但總有一些約束條件是開發者不能應用以上資料完整性約束來實行的。如入學時間不能晚於畢業時間;實現諸如此類的資料完整性保護,需要開發者自己通過建立儲存過程和觸發器、規則等來實現。

[b]2實施完整性的應用例項[/b]

2.1 通過「約束」實施資料的完整性。通過「約束」可實施列級和表級的資料完整性。sql server支援的「約束」有如下幾種:非空約束not null,主鍵約束primary key、惟一約束unique、核查約束check、外來鍵約束foreign key、預設值約束default。「約束」的定義,可在建立表或更改表同時進行。

建立表時定義「約束」

例子1 create table student

(學號char(6)primary key,

姓名char(8)not null,

性別char(2)check(性別='男'or性別='女'),

政治面貌 char(6),

)/*以上定義的全為列級資料完整性,定義「學號」列為主鍵,「姓名」列為非空值,「性別」列通過檢驗check(性別=『男』or性別=『女』)保證「性別」字段值為『男』或『女』。*/

create table score

( 學號char(6),

課程名char(20),

成績int,

補考成績int,

constraint pk_id primary key(學號,課程名),

constraint fk_33 foreign key(學號)references student(學號),

constraint fk_35 foreign key(課程名)references course(課程名)

)/*以上三個「約束」全為表級約束,約束constraint pk_id primary key(學號,課程名)保證「學號 課程名」非空且惟一,約束constraint fk_33 foreign key(學號)references student(學號)、constraint fk_35 foreign key(課程名)references course(課程名)保證該表中的「學號」和「課程名」字段值只能取student>中已存在的「學號」值和中已存在的「課程名」值。*/

2.2 通過「規則」實施資料的完整性。「規則」的作用類似於「檢查約束」,若將乙個「規則」繫結到指定列上,則可以檢查該列的資料是否符合「規則」的要求。「規則」與「檢查約束」的主要區別在於一列只能繫結乙個「規則」,但卻可以設定多個「檢查約束」。「規則的優點是同乙個規則物件可以供不同資料表的不同字段使用,但每個欄位最多只能和乙個規則物件結合。「使用「規則」的過程依次為:建立規則——繫結規則——解除繫結——刪除規則。

例子2 create rule rule_ck

as@成績》=0 and@成績<=100/*建立

名為「rule_ck」的「規則」*/

gosp_bindrule rule_ck,『student.成績』

/*將「規則rule_ck」繫結到的「成績」字段*/

2.3 通過「預設」實施資料的完整性。與「規則「類似,「預設值」物件(簡稱為「預設」)也是僅建立一次就可以繫結到資料庫的多個表的列或使用者定義的資料型別中,使它們共享「預設」。使用「預設」的過程與使用「規則」的過程類似,依次為:建立預設--繫結預設--解除繫結--刪除預設。

例子3 create default default_zz

as'群眾'/*建立名為」default_zz」的「預設」*/

gosp_bindefaultdefault_zz,『student.政治面貌'

/*將預設」default_zz」繫結到的「政治面貌」字段*/

2.4 通過「觸發器」實施資料的完整性。觸發器屬於一種特殊的儲存過程,可以在其中包含複雜的sql語句。觸發器與儲存過程的區別在於觸發器能夠自動執行並且不含有引數。通常可以在觸發器內編寫一段自動執行的程式,用於保證資料操作的完整性,從而擴充套件了對預設值、約束和規則的完整性檢查。對錶進行包括新增資料、刪除資料、更新資料中的一種或多種操作時,觸發器就會自動執行,在此不再舉例說明。

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

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

資料完整性

資料完整性定義 是指資料庫中的資料的正確性和完整性。資料完整性的型別 要求的資料。not null。有效檢查。資料的有效範圍檢查。字段檢查約束。資料域。實體完整性。主鍵欄位唯 一 非空。引用完整性引發的問題 1 插入 更新子表記錄的外鍵值在主表主鍵中不存在。2 刪除 更新父表的主鍵記錄有關聯外來鍵記...

資料完整性

乙個資料庫就是乙個完整的業務單元,可以包含多張表,資料被儲存在表中 在表中為了更加準確的儲存資料,保證資料的正確有效,可以在建立表的時候,為表新增一些強制性的驗證,包括資料字段的型別 約束 主鍵primary key 物理上儲存的順序 非空not null 此字段不允許填寫空值 惟一unique 此...