学习如何创建自文档化 SQL 命令文件,通过将 SQL 命令与有用的注释一起放置在文本文件中,可以根据需要执行任意多次。介绍 SQL 脚本文件的基本原理之后,本文展示了三种执行脚本文件的方法。然后您将回顾使用 SQL INSERT
语句将数据插入表中的基本原理,其中包括查看使用不同方式插入 10 个新行的示例。最后,本文展示了一个脚本,该脚本自动化该 INSERT
操作并显示新插入的数据以供验证。
SQL 脚本
在本系列的上一篇文章 “用 Apache Derby 进行数据库开发,第 2 部分:模式”(2006 年 4 月),在 ij
工具的提示符处直接执行 SQL 命令。通过使用 ij
工具,可以简单地用不同的 SQL 或 Derby 命令进行试验。但是,通常您将需要执行多个复杂的命令。为了简化调试一组复杂的 SQL 命令,将其写入文本文件中然后一次执行文本文件中的所有命令通常更加容易。该操作被称为运行 SQL 脚本,可以通过使用 Apache Derby 很容易地实现该操作。通过将 SQL 命令放置在脚本文件中,您将获得能够根据需要多次执行命令的附加好处。
脚本文件不难使用,如 清单 1 所示的第一个 Derby SQL 脚本示例。
清单 1. 第一个 Derby SQL 脚本
-- Ignore the database not created warning if present
connect 'jdbc:derby:test;create=true' ;
-- First delete the tables if they exist.
-- Ignore the table does not exist error if present
DROP TABLE bigdog.products ;
DROP TABLE bigdog.vendors ;
-- CREATE the products table for bigdog's Surf Shop
CREATE TABLE bigdog.products (
itemNumber INT NOT NULL,
price DECIMAL(5, 2),
stockDate DATE,
description VARCHAR(128)
) ;
-- CREATE the products table for bigdog's Surf Shop
CREATE TABLE bigdog.vendors (
itemNumber INT NOT NULL,
vendornumber INT NOT NULL,
vendorName CHAR(64)
) ;
exit ;
|
清单 1 所示的脚本重新创建了本系列上一篇文章中演示的 bigdog
模式和两个表(products
和 vendors
)。如果不清楚其中任何一个概念,在继续本文之前您应该返回并 阅读该文章。因为本文将介绍将数据插入表的基本原理,所以您首先需要创建准备接受新数据的表。
|
编辑 Derby SQL 脚本
脚本文件只是一种包含可以从 Apache Derby ij 工具直接运行的 SQL 命令和 Apache Derby 命令的组合的文本文件。脚本文件简化了 Apache Derby 数据库的开发和维护,并提供了一种用于构建数据库的自文档化技术。您应该将这些文件存储为 ASCII 文本文件,而非 RTF 文件(或其他任何格式),以防止文本编码错误。一些文本应用程序(比如 Microsoft® Windows® 系统中的写字板)可能试图将文件自动保存为富文本文件。一定要小心这一点,否则可能在尝试执行脚本文件时出现问题。 |
|
无需将用于创建表的 SQL 命令直接输入到 Derby ij
工具中,您可以将其放入文本文件中,并让 ij
工具直接运行文件中的命令。本文包括一个 .zip 文件(参阅 下载 一节以访问该文件),其中包含两个脚本文件;一个是 derby.create.sql,如 清单 1 所示。因为本文将逐步介绍该脚本文件中的代码行,所以您既可以参照 清单 1 所示的代码,也可以用您偏爱的文本编辑器打开该脚本文件。
该脚本文件包括了用两个破折号 (--
) 开头的几行。这些行是 SQL 注释;您应该使用它们来提供脚本文件中每个主要组件的用途的基本描述。 脚本中的第一个实际命令是 Derby connect
命令,它告诉 ij
工具连接 test
数据库,必要的话要先创建数据库。下一个命令是 SQL DROP
语句,它删除 bigdog
模式中的产品和供应商表。如果表不存在(当数据库刚创建时就会出现这种情况),将显示一条错误消息;但前面的 SQL 注释指明,您可以安全地忽略这些消息。
如果存在的话,首先放弃这些表,以便您可以用所需的正确的列定义创建新表。后两条 SQL 语句就执行该操作,在 bigdog
模式中创建产品和供应商表。脚本以 exit
命令结束,终止了与数据库的连接,并允许 ij
工具优雅地退出。下一步将学习如何执行 Derby 脚本文件。
在 ij 中运行脚本
脚本文件仅在可用于执行文件中列出的命令时才有用。要执行 SQL 脚本文件中的命令,最简单的方法是从 ij
工具中运行脚本文件。但是,在可以运行之前,需要创建一个测试目录并展开 derby4.zip 文件,该文件可在本文下载(参阅 下载 一节)。该过程如 清单 2 所示。
清单 2. 在 ij 中运行 SQL 脚本
rb$ mkdir test
rb$ cp derby4.zip test/
rb$ cd test/
rb$ unzip derby4.zip
Archive: derby4.zip
inflating: derby.create.sql
inflating: derby.insert.sql
rb$ ls
derby.create.sql derby.insert.sql derby4.zip
rb$ java org.apache.derby.tools.ij
ij version 10.1
ij> run 'derby.create.sql' ;
ij> -- Ignore the database not created warning if present
connect 'jdbc:derby:test;create=true' ;
ij> -- First delete the tables if they exist.
-- Ignore the table does not exist error if present
DROP TABLE bigdog.products ;
ERROR 42Y07: Schema 'BIGDOG' does not exist
ij> DROP TABLE bigdog.vendors ;
ERROR 42Y07: Schema 'BIGDOG' does not exist
ij> -- CREATE the products table for Bigdog's Surf Shop
CREATE TABLE bigdog.products (
itemNumber INT NOT NULL,
price DECIMAL(5, 2),
stockDate DATE,
description VARCHAR(128)
) ;
0 rows inserted/updated/deleted
ij> -- CREATE the products table for Bigdog's Surf Shop
CREATE TABLE bigdog.vendors (
itemNumber INT NOT NULL,
vendornumber INT NOT NULL,
vendorName CHAR(64)
) ;
0 rows inserted/updated/deleted
ij> exit ;
|
虽然 清单 2 似乎对于执行 Derby 脚本有些冗长,但过程十分简单。该示例假设您具有开放的终端(或Windows Command 进程窗口,但要注意,本例中的一些步骤是特定于 UNIX® 的),并且您已经更改到保存包含本文提供的 两个脚本文件 的 derby4.zip 文件的目录。要最小化任何错误的几率,首先创建一个新目录,将 derby4.zip 文件复制到新目录中,并更改到这个新目录。然后展开示例 .zip 文件。如目录清单所示,现在您在新目录中具有三个文件:derby4.zip、derby.create.sql 和 derby.insert.sql。现在,您将只使用 create 脚本文件; insert 脚本文件将在本文的最后使用。
|
如果出问题怎么办?
有时候,不管您怎么努力,事情不会总是如您所愿。如果不能安全地执行 derby.create.sql 脚本,有许多可能性需要检查:
- 确保 Derby
ij 工具正确启动。若非如此,您可能遇到 CLASSPATH 工具问题。
- 确保具有创建新数据库的空闲磁盘空间。
- 确保在试图执行脚本文件的目录中具有正确的权限(读取脚本文件和创建新数据库)。
- 确保脚本文件是简单的 ASCII 文本文件。
如果全都不是,则检查最新的 Derby 文档,该文档可从 Apache Derby Web 站点(参阅 参考资料 一节中的链接)上免费获得,或在 Derby 邮件列表中询问您的问题。 |
|
清单 2 的其余部分展示如何从 Derby ij
工具中执行 derby.create.sql 脚本文件。 首先启动 ij
工具。如果启动时出现问题,您可能需要回顾 本系列第一篇文章 中提供的 Derby 安装验证步骤。看到 ij>
提示之后,就可以运行合适的脚本文件了。通过使用 run
命令可实现该操作,该命令接受单个参数:单引号括起的脚本文件名。
当该脚本执行时,您可能会看到新 ij>
提示、命令和警告或错误消息的组合。这种显示可能有些笨拙,但 run
命令会执行您的脚本文件,就像您直接将命令键入 ij
工具中一样。最后,处理 exit
命令,脚本完成,关闭 ij
工具。如果第一个脚本执行的输出与 清单 2 所示的相匹配,那么恭喜您了。您现在已经有了一个带有两个可以保存数据的新表的新测试数据库了。
虽然从 ij
工具中执行脚本十分有效,但是有时候进一步自动化该过程会更加容易。下一节将讨论如何从命令行直接执行 Derby 脚本文件。
从命令行运行脚本
本节介绍从命令行运行脚本的两种方法。第一种方法如 清单 3 所示。
清单 3. 从命令行运行 SQL 脚本
rb$ java org.apache.derby.tools.ij derby.create.sql
ij version 10.1
ij> -- Ignore the database not created warning if present
connect 'jdbc:derby:test;create=true' ;
WARNING 01J01: Database 'test' not created, connection made to existing database instead.
ij> -- First delete the tables if they exist.
-- Ignore the table does not exist error if present
DROP TABLE bigdog.products ;
0 rows inserted/updated/deleted
ij> DROP TABLE bigdog.vendors ;
0 rows inserted/updated/deleted
ij> -- CREATE the products table for Bigdog's Surf Shop
CREATE TABLE bigdog.products (
itemNumber INT NOT NULL,
price DECIMAL(5, 2),
stockDate DATE,
description VARCHAR(128)
) ;
0 rows inserted/updated/deleted
ij> -- CREATE the products table for Bigdog's Surf Shop
CREATE TABLE bigdog.vendors (
itemNumber INT NOT NULL,
vendornumber INT NOT NULL,
vendorName CHAR(64)
) ;
0 rows inserted/updated/deleted
ij> exit ;
|
清单 3 展示了直接从命令行执行脚本文件的第一种方法。在这种情况下,提供脚本文件名作为 ij
工具的命令行参数。脚本文件中的行像以前一样读取,并顺序处理。如果首先从 ij
工具中直接执行 derby.create.sql 文件,现在在命令行运行相同目录中的同一脚本文件,您应该会看到类似于 清单 3 中的输出(一切都在清单中第一行之后)。如上所示,您收到一条警告消息,指明测试数据库未创建,因为它已经存在。但是,这次您不会收到指明不能放弃两个表的错误消息,因为您已经创建了它们(如 清单 2 所示)。在放弃产品和供应商表之后,您重新创建它们,脚本退出。
还有另一种方法来运行 Derby 脚本:重定向 ij
工具的标准输入以从脚本文件中读取。在基于 UNIX 的操作系统中,通过使用适合您的 shell 的 STDIN 重定向字符最容易实现了,比如为 Bash shell 使用小于号 (<
)。这种方法在 清单 4 中展示,具有减少屏幕上显示的输出量的好处。
清单 4. 从命令行运行 SQL 脚本(第 2 部分)
rb$ java org.apache.derby.tools.ij < derby.create.sql
ij version 10.1
ij> WARNING 01J01: Database 'test' not created, connection made to existing database instead.
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
ij> 0 rows inserted/updated/deleted
ij> 0 rows inserted/updated/deleted
ij> 0 rows inserted/updated/deleted
ij> 0 rows inserted/updated/deleted
ij>
rb$
|
在 清单 4 中可以看到,当您通过重定向 ij
工具的标准输入执行脚本时,惟一显示的文本是来自 ij
工具的消息,其中包括 0 rows inserted/updated/deleted
等信息消息或警告和错误消息。如果想要消除这些消息,可以重定向 ij
工具的标准输出和标准错误。例如,如果正在 Bash shell 中工作,则可以使用
java org.apache.derby.tools.ij < derby.create.sql > derby.create.out 2> derby.create.err
实现这一点,它运行 derby.create.sql 脚本文件,将输出消息保存到 derby.create.out
中,并将所有 ij
错误消息保存到 derby.create.err
中。
现在您将关注使用 Apache Derby 将数据插入表的过程。要继续进行,您需要一个 Derby 数据库,它必须具有可用的产品表。如果您还未实现此步骤,您需要执行 derby.create.sql 脚本文件。
在 Apache Derby 中插入数据
构建数据库应用程序时最重要的任务之一是将数据插入到数据库中。这与数据库软件的好坏无关,如果将坏数据放入数据库中,其他一切都不重要了。有许多方法可以将数据插入数据库中,但下文将主要使用 SQL INSERT
语句将数据插入 Apache Derby 数据库中。
SQL INSERT 语句
在使用 SQL INSERT
语句将数据插入 Apache Derby 数据库中之前,必须知道如果正确地使用该语句。清单 5 提供了 Apache Derby 中 SQL INSERT
语句的完整语法。
清单 5. SQL INSERT 语法
INSERT INTO table-Name
[ (Simple-column-Name [ , Simple-column-Name]* ) ]
Expression
|
该语法应该比较熟悉。如本系列的 上一篇文章 所述,方括号 ([
]
) 包括可选参数。其用途不是立即清楚的惟一组件是 Expression
;但这个简单的短语能够有多复杂呢?当然,外表可能会蒙蔽人;Expression
词可以扩展为下列四个不同的结构之一:
- 单行
VALUES
列表
- 多行
VALUES
列表
SELECT
表达式
UNION
表达式
其中,最后两个超出了本文范围,将在后续文章中详细介绍。前两个相似;惟一的区别在于第一种形式将一行插入表中,而后一种形式将多行插入表中。
可以使用 SQL INSERT
语句的可选部分指定要插入到表中的值的列顺序。默认情况下,数据插入到表中的列顺序与创建表时列的列出顺序相同。有时候您希望更改这种顺序或可能希望只为具有 NOT NULL
约束的列指定值。通过在 SQL INSERT
语句中显式列出列,您将获得对操作的更多控制,并可以更容易地处理这些特定的用例。
SQL VALUES
表达式的语法相当简单,如 清单 6 所示。
清单 6. SQL VALUES 语法
{
VALUES ( Value {, Value }* )
[ , ( Value {, Value }* ) ]* |
VALUES Value [ , Value ]*
}
|
该语法首先显示多行格式,然后是单行格式(记住,竖线字符 |
表示或者,星号字符 *
表示一个或多个)。value
词表示想要插入特定列的值。要将数据插入多列,必须将一行的数据括在逗号分隔的括号内。
下面两节展示要实现的语法示例。
使用 SQL 插入数据
如 清单 7 所示,要将数据插入表中,首先需要启动 ij
工具并连接数据库。记住,要将数据插入表中,表必须存在。如果还没有表的话,则执行本文之前所述的用于创建表的脚本。
清单 7. 插入单行
rb$ java org.apache.derby.tools.ij
ij version 10.1
ij> connect 'jdbc:derby:test' ;
ij> INSERT INTO bigdog.products
VALUES(1, 19.95, '2006-03-31', 'Hooded sweatshirt') ;
1 row inserted/updated/deleted
ij> INSERT INTO bigdog.products(itemNumber, price, stockDate, description)
VALUES(2, 99.99, '2006-03-29', 'Beach umbrella') ;
1 row inserted/updated/deleted
ij> INSERT INTO bigdog.products(itemNumber, price, stockDate)
VALUES(3, 0.99, '2006-02-28') ;
1 row inserted/updated/deleted
ij> exit ;
|
本例展示了对 bigdog.products
表的三个单行插入。第一个 SQL INSERT
语句没有提供列列表;它插入 itemNumber
、price
、stockDate
和 description
。注意,插入到 stockDate
和 description
列的值括在单引号字符中。description
列是长度可变的字符串,所以它预计是一个字符串(通过将字符数据括在单引号中指明)。另一方面,stockDate
列是一个日期列;它需要您将日期括在单引号中以正确解析出正确的日、月和年信息。(有关 SQL INSERT
操作期间数据类型格式的更多指南,请阅读联机文档或参阅本系列的 上一篇文章。)
第二个 SQL INSERT
语句显式列出所有四列并相应地插入新值。最后一个 SQL INSERT
语句只列出三列并只插入三个值。description
列留为空白,这意味着它将具有 NULL
值。
虽然单行 SQL INSERT
语句可能有用,但当您需要插入多行时,直接插入多行可能更有效,如 清单 8 所示。
清单 8. 插入多行
rb$ java org.apache.derby.tools.ij
ij version 10.1
ij> connect 'jdbc:derby:test' ;
ij> INSERT INTO bigdog.products(itemNumber, price, stockDate, description)
VALUES (4, 29.95, '2006-02-10', 'Male bathing suit, blue'),
(5, 49.95, '2006-02-20', 'Female bathing suit, one piece, aqua'),
(6, 9.95, '2006-01-15', 'Child sand toy set'),
(7, 24.95, '2005-12-20', 'White beach towel'),
(8, 32.95, '2005-12-22', 'Blue-striped beach towel'),
(9, 12.95, '2006-03-12', 'Flip-flop'),
(10, 34.95, '2006-01-24', 'Open-toed sandal') ;
7 rows inserted/updated/deleted
ij> exit ;
|
在本例中,首先启动 ij
工具并连接数据库。下一代码行通过显式列出所有四列并为每行提供新值,将 7 行插入数据库中。如前所述,多行插入将每个新行的值包括在括号内,这些值之间用逗号分隔。该 SQL INSERT
语句执行之后,ij
工具报告这 7 新行已经插入。
在 Apache Derby 中插入数据
多行插入优于多个单行插入;但更好的方法是将 SQL INSERT
语句放在脚本文件中,运行脚本来插入数据。这种方法允许您更容易地修复错误或根据需要重新插入数据,而无需重新创建必需的 SQL INSERT
语句。如前所述,可以 随本文下载 的 .zip 文件包括两个 SQL 脚本文件。第二个脚本文件 (derby.insert.sql) 将上一节提供的 10 行插入到数据库中,并执行简单查询以显示结果,从而验证插入操作。执行查询操作的机制将在下一篇文章中详细讨论,但您不必理解查询就能够运行插入脚本。
要执行脚本,可以选择本文开头展示的三个方法之一。在 清单 9 中,通过重定向 ij
工具的标准输入以从脚本文件中读取的方式,来执行插入脚本。插入 10 行,然后结果显示到屏幕上。
清单 9. 验证插入操作
$ java org.apache.derby.tools.ij < derby.insert.sql
ij version 10.1
ij> ij> 10 rows inserted/updated/deleted
ij> ITEMNUMBER |PRICE |STOCKDATE |DESCRIPTION
-------------------------------------------------------------------------------
1 |19.95 |2006-03-31|Hooded sweatshirt
2 |99.99 |2006-03-29|Beach umbrella
3 |0.99 |2006-02-28|
4 |29.95 |2006-02-10|Male bathing suit, blue
5 |49.95 |2006-02-20|Female bathing suit, one piece, aqua
6 |9.95 |2006-01-15|Child sand toy set
7 |24.95 |2005-12-20|White beach towel
8 |32.95 |2005-12-22|Blue-striped beach towel
9 |12.95 |2006-03-12|Flip-flop
10 |34.95 |2006-01-24|Open-toed sandal
10 rows selected
ij> ij> rb$
|
结束语
本文讨论了两个主要主题。首先向您介绍了 SQL 脚本文件的概念,该脚本文件可用于以自动方式执行多个 SQL(或 Derby)命令。使用 Apache Derby ij
工具执行 SQL 脚本文件有三种方法:从工具中、使用 run
命令或直接从命令行使用这两种方法之一。然后,您回顾了 INSERT
语句的 SQL 语法,并查看了如何使用该语句将数据插入 Derby 数据库中的示例。后续文章将在此基础上查询、更新和删除 Apache Derby 数据库中的数据。
下载
描述 |
名字 |
大小 |
下载方法 |
Derby SQL scripts for this article |
derby4.zip |
1KB |
HTTP |