1. 程式人生 > >數據庫系統概念:事務、完整性約束

數據庫系統概念:事務、完整性約束

組成 asc arch mysq ima part 但是 inter room

public class DataBase {
    public static void main() {

    }
}

/*
    4.3 事務

    事務由查詢或更新語句的序列組成。SQL標準規定當一條SQL語句被執行時,就隱式地開始
    了一個事務:
        Commit work:提交當前事務。事務被提交後,一個新的事務自動開始。
        Rollback work:回滾當前事務。

    如果一個事務要執行多條SQL語句,就必須關閉單獨SQL語句的自動提交。一個較好的選擇是:
    允許多條SQL語句包含在begin atomic 。。。 end之間。所有關鍵字之間的語句構成一個
    單一事務。
 
*/ /* 4.4 完整性約束 一般來說,一個完整性約束可以是屬於數據庫的任意謂詞。但檢測任意謂詞的代價可能太高了。 因此,大多數數據庫系統允許用戶指定那些只需要極小的開銷就可以檢測的完整性約束。 完整性約束被看做是數據庫模式設計過程的一部分~ */ /* 4.4.1 單個關系上的約束 not null,unique,check(<謂詞>) */ /* 4.4.3 unique約束 MySql5.7 中說,unique約束是來保證一列中數據不會相同的。 這兒有: unique(a1,a2,a3,...,an) unique聲明指出了屬性a1,a2,a3,...,an形成了一個候選碼:即在關系中沒有兩個元組能 在所列出的屬性上取值相同。
*/ /* 4.4.4 check子句 案例: create table section (course_id varchar(8), sec_id varchar(8), semester varchar(8), year numeric(4.0), building varchar(15), room_number varchar(7), primary_key(course_id,sec_id) check(semester in (’Fall‘,‘Winter‘,‘Spring‘,‘Summer‘))); 怎麽說,在MySQL中貌似是一個用enum完成這個功能的。
*/ /* 4.4.5 參照完整性 默認情況下,SQL中外碼參照的是被參照表中的主碼屬性。SQL還支持一個可以被顯式指定被 參照關系的屬性列表的references子句。然而,這個指定的屬性列表必須聲明為被參照關系 的候選碼,要麽使用primary key約束,要麽使用unique約束。在更為普遍的參照完整性約 束形式中,被參照的屬性不必是候選碼,這樣的形式還能在SQL中直接聲明。SQL標準提供了 另外的結構,用於實現這樣的約束~~~ ******************************************************************** ******************************************************************** 當違反參照性約束是,通常的處理是拒絕導致完整性破壞的操作(即進行更新操作的事務被回 滾)。但是,在foreign key子句中可以指明,如果被參照關系上的刪除或者更新操作違反了 約束,那麽系統必須采取一些步驟通過修改參照關系中的元組來恢復完整性約束,而不是拒絕 這樣的動作。 create table course ( foreign key (dept_name) references department on delete cascade, on update cascade ); 由於有了與外碼聲明相關聯的on delete cascade子句,如果刪除了department中的元組 導致了此參照關系完整性被違法,則刪除並不會被系統拒絕,而是對course關系做級聯“刪除” 類似的,如果更新被參照字段時違反了約束,則更新操作並不被系統拒絕,而是將course中參 照的元組的dept_name字段也改為新值。SQL還允許foreign key子句指明除cascade以外 的其他動作,如果約束被違反:可將參照域置為null(用set null代替cascade),或者置為 域的默認值。 空值使得SQL中參照約束的語義復雜化了。外碼中的屬性允許為null,只要它們沒有被聲明為 not null。如果給定元組中外碼的所有列上均取非空值,則該院組采用外碼約束的通常定義 如果某外碼設置為null,則該元組自動被認為滿足約束。 ******************************************************************** ******************************************************************** */ /* 4.4.6 事務中對完整性約束的違反 為了處理事務中對完整性約束的違反,SQL標準允許將initially deferred子句加入到 約束聲明中:這樣完整性約束不是在事務中間步驟上檢查,而是在事務結束的時候檢查。 對於聲明為可延遲的約束,執行set constraints constraint-list deferred作為 事務的一部分,會導致對指定約束的檢查被延遲到該事務結束時執行。 可以臨時取代的方式是,先插入null,再更新這個null值,前提是數據庫允許這樣的操作。 */ /* 4.4.7 復雜check條件與斷言 一個斷言就是一個謂詞,它表達了我們希望數據庫總能滿足的一個條件。域約束和參照 完整性約束是斷言的特殊形式。域約束和參照完整性約束就是斷言的特殊形式。 案例分析: 1.對於student關系中的每個元組,它在屬性tot_cred上的取值必須等於該生所成 功修完課程的學分總和。 2.每位教師不能在同一學期的同一時間段在兩個教師授課。 斷言語法: create assertion <assertion-name> check <predicate> create assertion credits_earned_constraint check (not exists( select ID from student where tot_cred <>( select sum(credits) from takes natural course where student.ID = takes.ID and grade in not null and grade <>‘F‘); */

數據庫系統概念:事務、完整性約束