apache derby
SQL脚本
在本系列的上一篇文章“ 使用Apache Derby进行数据库开发,第2部分:模式 ”(developerWorks,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脚本
脚本文件只是一个文本文件,其中包含SQL命令和Apache Derby命令的组合,这些命令可以直接从Apache Derby ij
工具运行。 脚本文件简化了Apache Derby数据库的开发和维护,并提供了用于构建数据库的自文档技术。 您应该将这些文件存储为ASCII文本文件,而不是RTF文件(或任何其他格式),以防止出现文本编码错误。 某些文本应用程序(例如Microsoft®Windows®系统上的Wordpad)可能会尝试自动将文件另存为RTF文件。 请小心避免这样做,否则在尝试执行脚本文件时可能会遇到问题。
您可以将表创建SQL命令直接输入到Derby ij
工具中,而不是直接将其放入文本文件中,并使ij
工具直接在文件中运行命令。 本文包括一个包含两个脚本文件的.zip文件(请参阅下载部分以访问该文件)。 清单1中显示了其中之一derby.create.sql。 在本文逐步介绍该脚本文件中的各行时,您可以按照清单1中所示的代码进行操作,或者在您喜欢的文本编辑器中打开脚本文件。
脚本文件包含多行以两个破折号( --
)开头的行。 这些行是SQL注释; 您应该使用它们来提供脚本文件中每个主要组件用途的基本描述。 脚本中的个实际命令是Derby connect
命令,该命令告诉ij
工具连接到test
数据库,并在必要时首先创建它。 接下来的命令是SQL DROP
语句,该语句从bigdog
架构中删除产品和供应商表。 如果表不存在(如果刚创建数据库,则是这种情况),将显示错误消息;否则,将显示错误消息。 但正如前面SQL注释所示,您可以放心地忽略这些消息。
首先删除表(如果存在),以便可以使用所需的确切列定义来干净地创建新表。 接下来的两个SQL语句就是这样做的,在bigdog
模式中创建了product和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)
- ) ;
- 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)
- ) ;
- rows inserted/updated/deleted
- ij> exit ;
尽管清单2仅执行Derby脚本似乎很长,但是过程很简单。 本示例假定您已打开终端(或Windows Command进程窗口-但请注意,本示例中的某些步骤是特定于UNIX®的),并且您已更改为保存derby4.zip文件的目录。包含本文提供的两个脚本文件 。 为了大程度地减少出错的可能性,您首先创建一个新目录,将derby4.zip文件复制到该新目录中,然后切换到该新目录。 然后展开示例.zip文件。 如目录清单所示,新目录中现在有三个文件:derby4.zip,derby.create.sql和derby.insert.sql。 现在,您将只使用创建脚本文件; 插入脚本文件将在本文末尾使用。
如果事情不顺利怎么办?
有时候,无论您多么努力,事情都不是很正确。 如果您不能安全地执行derby.create.sql脚本,则可以进行多种检查:
- 确保Derby
ij
工具正确启动。 如果不是,则可能是CLASSPATH
工具问题。 - 确保您有可用的磁盘空间来创建新数据库。
- 确保在尝试执行脚本文件的目录中具有适当的权限(以读取脚本文件并创建新数据库)。
- 确保您的脚本文件是简单的ASCII文本文件。
如果所有其他方法均失败,请查看新的Derby文档,该文档可从Apache Derby网站免费获得(请参阅参考资料部分以获取链接),或在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 ;
- rows inserted/updated/deleted
- ij> DROP TABLE bigdog.vendors ;
- 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)
- ) ;
- 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)
- ) ;
- 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.
- ij> rows inserted/updated/deleted
- ij> rows inserted/updated/deleted
- ij> rows inserted/updated/deleted
- ij> 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
工具并连接到数据库。 下一行通过显式列出所有四列并为每一行提供新值,将七行插入数据库。 如前所述,多行插入将每个新行的值括在括号内,并且这些值之间用逗号分隔。 在此SQL INSERT
语句之后, ij
工具报告已插入七个新行。
在Apache Derby中插入数据
多行刀片优于多个单行刀片。 但是更好的技术是将SQL INSERT
语句放置在脚本文件中,然后运行脚本以插入数据。 这种方法使您可以更轻松地修复错误或在必要时重新插入数据,而无需重新创建必需SQL INSERT
语句。 您可以通过本文下载的.zip文件包括两个SQL脚本文件,如前所述。 第二个脚本文件(derby.insert.sql)将上一节中介绍的十行插入数据库,并执行简单的查询以显示结果,从而验证插入操作。 在下一篇文章中将详细讨论执行查询操作的机制,但是您不必了解查询就能运行插入脚本。
要执行脚本,可以选择本文开头介绍的三种方法中的任何一种。 在清单9中 ,通过重定向ij
工具的标准输入以从脚本文件读取来执行插入脚本。 插入十行,结果显示在屏幕上。
清单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数据库中的数据。
翻译自: https://www.ibm.com/developerworks/opensource/library/os-ad-trifecta4/index.html
apache derby