编写小型数据库(一)——建立数据库
编程爱好者
Delphi是目前最流行的编程工具之一,它在开发数据库应用程序方面有着众多的优越性,提供了强大的开发基于客户/服务器模式数据库应用程序的能力。在数据库访问方面,配有Borland Database Engine(BDE),可通过SQL Links、ODBC等技术访问多种数据库,也可以利用ADO来访问各种数据库。在应用程序客户端开发方面,Delphi提供了大量的用于数据库应用开发的各种组件,可以极大地提高开发效率。
在学习Delphi数据库编程之前,我们应该对数据库有一定的认识。
一、认识数据库
1.数据(Data)
数据库是存放数据的仓库,数据的种类很多,如数字、文字(商家的订单信息、供应商信息等)、图形、图像。
2.数据库(Database)
数据库是长期存放在计算机上的,能够识别的,有组织、可共享、具有一定安全性的数据集合。在数据库中,一般都采用关系模型,通过表格来实现。
3.数据库管理系统(DataBase Management System)
数据库管理系统是位于用户软件和操作系统之间的数据库管理软件,常见的数据库管理系统有Oracle、Microsoft SQL Server、Sybase、Informix等。
4.数据库系统(DataBase System)
数据库系统的构成见图1:

实际开发中,数据库系统常分为两类:桌面型数据库系统和网络型数据库系统。桌面型数据库系统指只在本机运行、不与其他计算机交换数据的数据库系统,用于小型的信息管理;网络型数据库系统指能够通过网络进行数据共享的数据库系统,多人可以通过多台计算机对数据库进行操作,可以通过数据库对用户的权限进行管理。目前,网络型数据库系统的应用前景越来越广泛。有关数据库的术语由于篇幅关系没做深入讲解,有兴趣的读者可以参考相关书籍。
下面我们以Microsoft SQL Server2000为例,讲解建立一个数据库的详细过程。
Microsoft SQL Server2000安装完成后,依次点击“开始→程序→Microsoft SQL Server→企业管理器”,启动企业管理器程序,SQL Server企业管理器(Enterprise Manager)是SQL Server软件的一个组成部分,它给用户提供了一个集成的管理控制台来集中管理多个服务器。在Windows进程中的名字叫mmc.exe。
企业管理器的界面如图2,我们对数据库的大部分操作都在这个程序中执行。

二、创建一个新的数据库
1.在企业管理器中,点击菜单“操作”,选择“新建数据库”,在弹出的对话框中,需要确定新建的数据库的名称和存放的路径。
新建的数据库的名称为test,存放的路径为D盘。注意:修改了数据文件的路径后,最好手动把日志文件的路径也修改到相同目录下,确定后,新建的数据库就创建了。在D盘下可以找到test_Data.MDF和test_Log.LDF两个文件,在企业管理器树中也能找到test数据库了。
2.数据库创建后,我们就根据实际需要创建表了。右键点击企业管理器树中的“表”后,在弹出的菜单中选择“新建表”,在弹出的对话框中对表的结构进行详细设计。定义四个字段,分别表示姓名、年龄、性别、住址。注意定义字段时要考虑数据类型、长度是否合法,如果把姓名定义为数字型或者把年龄的长度设置为1,将来数据就会出现意想不到的情况。当表设计完成后点击“保存”按钮,输入表名PersonInfo,对表的设计就初步完成了。重复上述操作可以建立多个表。
建立数据库以及建立表相对来说比较简单,按部就班就能完成。不过在实际做项目过程中,在建立表之前最好根据需求考虑完善后再进行。如果到项目编码中期再更改表结构,会让人心烦意乱的。
三、值得注意的概念
1.存储过程
存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行,它还拥有强大的编程功能。存储过程相当于存放在数据库中的函数,当应用程序调用存储过程时,将被数据库管理系统调用并执行,然后将执行结果返回给应用程序。存储过程可包含程序流、逻辑以及对数据库的查询。它可以接收参数、输出参数、返回单个或多个结果集以及返回值。
2.触发器
触发器是一种特殊类型的存储过程,当使用一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效,触发器可以查询其它表,而且可以包含复杂的 SQL 语句。它们主要用于强制复杂的业务规则或要求。
3.事务性(Transaction)
事务是指不可分割的一组操作集合,集合的操作要么全部完成,要么全部取消,是一个不可分割的工作单位。
4.在设计表时需要注意以下几点
1)主关键字(Primary Key)
主关键字又叫主键,是唯一能确定表的一行(一条记录)的一个或多个字段,比如上面我们定义的PersonInfo表中,name字段就可以设定为主关键字,在设计表的窗体中,选中name这一行,点击“钥匙”按钮后就把name设置为主关键字了,这样每一条记录的name的信息就不能相同了。
主关键字的功能有:建立索引,利于快速查找和排序;分辨记录;保证引用的完整性。
2)索引(Index)
建立索引是为了提高数据库的查找和排序速度。关键字是一个特殊的索引。索引使数据库程序无须对整个表进行扫描就可以在其中找到所需要的数据。用于索引的字段不需要唯一,但唯一的字段的索引能获得更高的效率。
3)外部关键字(Froeign Key)
外部关键字又称外键,用于建立和加强两个表数据之间链接的一个或多个字段。将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的连接。这一列或多列就成为第二个表的外键。外键也是一种约束条件,约束的主要目的是控制存储在外键表中的数据,还可以控制对主键表中数据的修改。下面举例说明,比如我们定义了两张表,表PersonInfo的name字段定义为主关键字,其中name列的数据是唯一的,也就是名字不可重复,数据见图3:

表wage存放员工每个月的工资,所以名字可以重复,数据见图4:

如果把表PersonInfo中的第四条记录“曾虹云”删除,那么表wage中的前三条记录就显得孤立了,既然员工“曾虹云”的基本信息都没有了,怎么会保留每个月的薪水呢?外部关键字防止了这种情况的出现,我们对表wage进行如下设计:
在表wage的设计窗口中点击按钮“管理索引/键…”,在弹出的对话框中点击“关系”标签页,点击“新建”按钮,分别在主键表中选择name和在外键表中选择name,这样我们就设置了一个外键,把PersonInfo和Wage两张表做了关联,当Wage表中有“曾虹云”的记录时,表PersonInfo是不允许删除“曾虹云”这条记录的,这样就保证了数据引用的完整性。