Skip to content

2. Firebird 教程

在介绍SQL语言的基础知识之前,我们将向读者展示如何安装Firebird数据库管理系统以及IB-Expert图形化客户端。

2.1. 在哪里可以找到 Firebird?

Firebird 的官方网站是 [http://firebird.sourceforge.net/]。下载页面提供以下链接(2005年4月):

Image

您将下载以下内容:

firebird-win32
适用于 Windows 的数据库管理系统
firebird-net-provider
一个用于 .NET 应用程序的类库,允许在不使用 ODBC 驱动程序的情况下访问该数据库管理系统。
firebird-ODBC-driver
Firebird ODBC 驱动程序

请安装这些组件。数据库管理系统(DBMS)安装在内容类似于以下内容的文件夹中:

二进制文件位于 [bin] 文件夹中:

fbguard.exe
允许您启动/停止数据库管理系统
isql.exe
用于管理数据库的命令行客户端

请注意,默认情况下,数据库管理系统管理员的用户名为 [SYSDBA],密码为 [masterkey]。[开始] 菜单中已添加相关选项:

Image

通过 [Firebird Guardian] 选项,您可以启动/停止 DBMS。启动后,DBMS 图标将保留在 Windows 任务栏中:

若要使用命令行客户端 [isql.exe] 创建和管理 Firebird 数据库,您必须阅读产品 [doc] 文件夹中随附的文档。

2.2. Firebird 文档

有关 Firebird 及 SQL 语言的文档可在 Firebird 网站上找到(2006 年 1 月):

Image

提供多种英文手册:

Firebird 1.5 快速入门指南
开始使用 Firebird
Firebird 1.5 错误代码
了解 FB 返回的错误代码

还提供 SQL 培训手册:

Image

数据定义指南
了解如何创建表、可用的数据类型等
语言参考
使用 Firebird 学习 SQL 的参考指南

使用图形化客户端是快速操作 Firebird 并学习 SQL 的便捷方式。其中一种客户端是 IB-Expert,下文将对此进行介绍。

2.3. 使用 IB- Expert 操作 Firebird 数据库管理系统

IB-Expert 的官方网站为 [http://www.ibexpert.com/]。其下载页面提供了以下链接:

Image

请选择免费版本 [Personal Edition]。下载并安装后,您将获得一个类似于下图所示的文件夹:

Image

可执行文件为 [ibexpert.exe]。通常在 [开始] 菜单中会有一个快捷方式:

Image

启动后,IBExpert将显示以下窗口:

Image

请使用 [ 数据库/创建数据库] 选项来创建数据库:

服务器
可以是 [local] 或 [remote]。在此,我们的服务器与 [IBExpert] 位于同一台机器上。因此,我们选择 [local]
数据库
使用下拉菜单中的 [文件夹] 按钮选择数据库文件。Firebird 将整个数据库存储在一个文件中。这是它的优势之一。您只需复制该文件,即可将数据库从一台计算机转移到另一台。系统会自动添加 [.gdb] 后缀。
用户名
SYSDBA 是当前 Firebird 发行版的默认管理员
密码
masterkey 是当前 Firebird 发行版中 SYSDBA 管理员的密码
方言
要使用的 SQL 方言
注册数据库
如果勾选此框,IBExpert将在数据库创建后显示一个链接

如果在点击 [确定] 按钮创建数据库时,您看到以下警告:

Image

这意味着您尚未启动 Firebird。请启动它。随后将出现一个新窗口:

Image

字符集
要使用的字符集。尽管上方的截图未显示任何信息,但建议从下拉列表中选择 [ISO-8859-1] 字符集,该字符集支持带重音的拉丁字符。
服务器版本
[IBExpert] 支持处理各种基于 Interbase 的数据库管理系统。请选择您已安装的 Firebird 版本:

点击 [注册] 确认此新窗口后,您将看到以下结果:

Image

要访问您创建的数据库,只需双击其链接。随后 IBExpert 将显示一个树形视图,供您访问数据库属性:

Image

2.4. 创建数据表

现在我们来创建一个表。右键单击 [表](参见上图),然后选择 [新建表] 选项。这将打开用于定义表属性的窗口:

首先,在输入字段 [1] 中将表命名为 [ARTICLES]:

使用输入字段 [2] 定义主键 [ID]:

双击 [PK](主键)字段即可将其设为主键。现在让我们使用上方按钮 [3] 添加字段:

Image

在“编译”定义之前,表不会被创建。请使用上方的 [Compile] 按钮来完成表的定义。IBExpert 会准备用于生成表的 SQL 查询,并请求确认:

Image

值得注意的是,IBExpert 会显示已执行的 SQL 查询。这使您既能学习 SQL 语言,也能了解可能使用的任何专有 SQL 方言。[提交] 按钮用于确认当前事务,而 [回滚] 则用于取消事务。在此,我们点击 [提交] 进行确认。操作完成后,IBExpert 会将创建的表添加到我们的数据库树中:

Image

双击该表,即可访问其属性:

Image

[约束]面板允许我们为该表添加新的完整性约束。让我们打开它:

Image

我们可以看到之前创建的主键约束。现在可以添加其他约束:

  • 外键 [Foreign Keys]
  • 字段完整性约束 [检查]
  • 字段唯一性约束 [Uniques]

让我们明确说明:

  • 字段 [ID, PRICE, CURRENTSTOCK, MINIMUMSTOCK] 必须大于 0
  • [NAME] 字段必须不为空且唯一

打开 [检查] 面板,在约束定义区域中右键单击以添加新约束:

Image

让我们定义所需的约束条件:

Image

请注意,上述约束 [NAME<>''] 使用的是两个单引号,而非双引号。使用上方的 [编译] 按钮编译这些约束:

Image

IBExpert 再次通过显示已执行的 SQL 查询,展现了其用户友好性。现在让我们转到 [Constraints/Unique] 面板,指定名称必须是唯一的。这意味着同一名称不能在表中出现两次。

Image

让我们定义该约束:

Image

然后进行编译。完成后,打开 [ARTICLES] 表的 [DDL](数据定义语言)面板:

Image

该面板会显示用于生成该表及其所有约束条件的 SQL 代码。您可以将此代码保存到脚本中以便日后运行:

SET SQL DIALECT 3;
SET NAMES NONE;
CREATE TABLE ARTICLES (
    ID            INTEGER NOT NULL,
    NOM           VARCHAR(20) NOT NULL,
    PRIX          DOUBLE PRECISION NOT NULL,
    STOCKACTUEL   INTEGER NOT NULL,
    STOCKMINIMUM  INTEGER NOT NULL
);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_ID check (ID>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_PRIX check (PRIX>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_STOCKACTUEL check (STOCKACTUEL>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_STOCKMINIMUM check (STOCKMINIMUM>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_NOM check (NOM<>'');
ALTER TABLE ARTICLES ADD CONSTRAINT UNQ_NOM UNIQUE (NOM);
ALTER TABLE ARTICLES ADD CONSTRAINT PK_ARTICLES PRIMARY KEY (ID);

2.5. 向表中插入数据

现在是向 [ARTICLES] 表中输入数据的时候了。为此,请使用其 [数据] 面板:

Image

通过双击表中各行的输入字段即可输入数据。使用 [+] 按钮添加新行,使用 [-] 按钮删除行。这些操作都在一个事务中进行,需通过 [提交事务] 按钮提交(参见上文)。如果不提交,数据将会丢失。

2.6. [IB-Expert] SQL 编辑器

SQL(结构化查询语言)允许用户:

  1. 通过指定表将存储的数据类型及数据必须满足的约束条件来创建表
  1. 向表中插入数据
  2. 修改特定数据
  3. 删除其他数据
  4. 利用数据检索信息
  5. ……

IBExpert 允许用户以图形化方式执行操作 1 至 4。我们刚才已经看到了这一点。当数据库包含许多表,且每张表都有数百行数据时,我们需要一些难以通过视觉方式获取的信息。例如,假设一家网店每月有数千名客户。 所有购买记录都保存在数据库中。六个月后,发现产品“X”存在质量问题。该商店希望联系所有购买过该产品的顾客,以便他们退货并免费换货。如何找到这些买家的地址?

  1. 你可以手动遍历所有表来查找这些买家,但这可能需要数小时。
  2. 我们可以通过运行一条SQL查询,在几秒钟内获取这些人的名单

无论何时

  • 当表中的数据量较大时
  • 当多个表相互关联时
  • 需要检索的信息分散在多个表中
  • ……

接下来我们将介绍 IBExpert 的 SQL 编辑器。您可以通过 [工具/SQL 编辑器] 选项或按 [F12] 键访问它:

Image

这将打开一个高级 SQL 查询编辑器,您可以在其中运行查询。让我们输入一个查询:

Image

使用上方的 [执行] 按钮执行该 SQL 查询。您将获得以下结果:

Image

上图中,[结果] 选项卡显示了 [Select] SQL 语句的结果表。若要执行新的 SQL 命令,只需返回 [编辑] 选项卡。随后您将看到已执行的 SQL 语句。

Image

工具栏上有几个有用的按钮:

  • [新建查询] 按钮可让您进入新的 SQL 查询:

Image

这将打开一个空白编辑页面:

Image

随后您可以输入新的 SQL 语句:

Image

并执行它:

Image

让我们回到 [编辑] 选项卡。已执行的各种 SQL 语句均由 [IB-xpert] 保存。通过 [上一个查询] 按钮,您可以返回之前执行的 SQL 语句:

Image

随后您将返回上一个查询:

Image

点击 [下一条查询] 按钮,即可跳转到下一条 SQL 语句:

Image

随后,您将在存储的 SQL 语句列表中看到下一条 SQL 语句:

Image

[删除查询] 按钮可让您从已存储语句列表中删除一个 SQL 语句:

Image

[清除当前查询] 按钮可清除所显示 SQL 查询的编辑器内容:

Image

[提交] 按钮允许您将对数据库所做的更改永久保存:

Image

[回滚] 按钮可让您撤销自上次 [提交] 以来对数据库所做的更改。如果自连接数据库以来尚未进行过 [提交],则自连接以来所做的更改将被撤销。

Image

我们来看一个例子。让我们在表格中插入一行:

Image

SQL 语句已执行,但屏幕上没有任何显示。我们无法确定插入操作是否成功。为了确认,让我们执行以下 SQL 语句 [新查询]:

Image

我们得到以下结果:

Image

该行确实已被插入。现在让我们通过另一种方式查看表的内容。双击数据库资源管理器中的 [ARTICLES] 表:

Image

我们得到如下表格:

Image

上方的箭头按钮可用于刷新表格。刷新后,上方的表格并未发生变化。看起来新行并未被插入。让我们返回 SQL 编辑器(F12),然后使用 [Commit] 按钮提交 SQL 语句:

Image

完成此操作后,让我们返回 [ARTICLES] 表。我们可以看到,即使使用 [刷新] 按钮,也没有任何变化:

Image

在上方打开 [字段] 选项卡,然后返回 [数据] 选项卡。这次,插入的行已正确显示:

Image

当开始执行各种 SQL 语句时,编辑器会在数据库上开启一个所谓的“事务”。这些 SQL 语句在 SQL 编辑器中做出的更改,只有在你保持在同一个 SQL 编辑器中时才会可见(你可以打开多个实例)。这就像 SQL 编辑器并非在实际数据库上操作,而是在其自身的副本上操作一样。实际上,这并非完全如此,但这个类比有助于我们理解“事务”的概念。 在事务期间对副本所做的所有更改,只有在通过 [提交事务] 进行提交后,才会显示在实际数据库中。随后当前事务终止,并开始一个新事务。

事务期间所做的更改可以通过名为 [Rollback] 的操作撤销。让我们尝试以下实验。使用以下 SQL 语句开始一个新事务(只需对当前事务执行 [Commit] 即可):

Image

让我们执行这条命令,它将删除 [ARTICLES] 表中的所有行,然后执行 [New Query] 并输入以下新的 SQL 命令:

Image

我们得到以下结果:

Image

所有行均已被删除。请注意,此操作是在 [ARTICLES] 表的副本上执行的。要验证这一点,请双击下方的 [ARTICLES] 表:

Image

并查看 [数据] 选项卡:

Image

即使我们点击[刷新]按钮,或者切换到[字段]选项卡后再切回[数据]选项卡,上面的内容依然保持不变。这已经解释过了。我们现在处于另一个事务中,该事务正在处理其自身的副本。现在让我们返回SQL编辑器(F12),并使用[回滚]按钮撤销之前执行的行删除操作:

Image

系统会要求我们确认:

Image

让我们确认。SQL 编辑器确认更改已回滚:

Image

让我们再次运行上面的 SQL 查询进行验证。之前被删除的行现在已经恢复:

Image

[回滚]操作已将SQL编辑器正在处理的副本恢复到事务开始时的状态。