第一節 示例數據
本文中使用的示例數據來自 sql server 6.5 基本圖書館應用程序。該圖書館應用程序用于跟蹤它的成員,它的圖書和借出。圖書館的數據庫方案如下圖所示。
圖書館數據庫方案:

表結構
圖書館應用程序的主要的表之一是 member 表,圖書館中的每一個成員具有一條記錄。一個有趣的情況是少年成員(其信息保存于 juvenile 表中)必須有成人(其信息保存于 adult 表中)擔保。對于少年和成年人,分別設計兩個單獨的表 adult 和 juvenile。這種設計方法節約了磁盤空間,因為一但你知道擔保人,所有的少年的地址信息就是多余的。另外,少年的期滿日期與成年人的相同。將來,你不必介意成年人的出生日期而只需注意少年的出生日期,因為在他們的第18個生日后他們就成為了成年人。
以下 sql server 語句用于創建 member,adult 和 juvenile 表:
| create table member ( member_no member_no not null identity(1,1), lastname shortstring not null , firstname shortstring not null , middleinitial letter null , photograph image null )create table adult ( member_no member_no not null , street shortstring not null , city shortstring not null , state statecode not null , zip zipcode not null , phone_no phonenumber null , expr_date datetime not null )create table juvenile ( member_no member_no not null , adult_member_no member_no not null , birth_date datetime not null ) | 
member 表中的 member_no 字段在添加新記錄時會由 sql server 自動生成。該字段是一個 identity 列。起始值為 1 ,增量值也是 1。這樣在表中輸入的第一條記錄的 member_no 值就是 1。對于后來插入到表中的記錄 member_no 的值自動增加 1。當添加一條記錄時如果客戶沒有指定 member_no 的值。sql server 自動維護它并詢問客戶使用什么值。
在 adult 和 juvenile 表中的 member_no 不是 identity 列。這些記錄中的值必須與 member 表中相應的 member_no 值相匹配。當新記錄添加到圖書館庫時,一個記錄首先會添加到 member 表中。sql server 的全局變量 @@identity 包含了自動生成的 member_no。然后添加到 adult 或 juvenile 表中的記錄的 member_no 值將使用 @@identity 中的值。
申明參照完整性
在早期版本的 sql server 參照完整性是通過使用觸發器強制執行,這與 visual foxpro 強制參照完整性相同。sql server 6.0 添加了可申明的參照完整性,這允許你定義你自己的作為數據結構一部分的參照完整性規則。第一步是在各表中創建基本關鍵字約束,如以下代碼所示:
| alter table member add constraint member_ident primary key clustered (member_no) alter table adult add constraint adult_ident primary key clustered (member_no) alter table juvenile add constraint juvenile_ident primary key clustered (member_no) | 
基本關鍵字約束創建一個唯一索引,用于強制 member_no 的唯一性。在示例中創建一組索引用于對數據進行物理排序。
定義可申明的參照完整性的第二步是在相關表之間創建外部關鍵字約束,如以下代碼所示:
| alter table adult add constraint adult_member_link foreign key (member_no) references member (member_no)alter table juvenile add constraint juvenile_member_link foreign key (member_no) references member (member_no)alter table juvenile add constraint juvenile_adult_link foreign key (adult_member_no) references adult (member_no) | 
第一個 alter table 定義了一個 member 和 adult 表之間的關系。這是一個一對一關系,雖然這里沒有代碼指明或強制是這種類型的關系。第二個 alter table 在 member 和 juvenile 表部定義了一個關系。最后一個 alter table 在 adult 和 juvenile 表之間定義一個關系。這是一個一對多關系。
要意識到 sql server 當前不支持級聯更新或刪除。如果你想那樣做就應該用觸發器代替約束。
新聞熱點
疑難解答