第一节 示例数据
本文中使用的示例数据来自 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 当前不支持级联更新或删除。如果你想那样做就应该用触发器代替约束。