學習如何創建自文檔化 SQL 命令文件,通過將 SQL 命令與有用的注釋一起放置在文本文件中,可以根據需要執行任意多次。介紹 SQL 腳本文件的基本原理之后,本文展示了三種執行腳本文件的方法。然后您將回顧使用 SQLINSERT
語句將數據插入表中的基本原理,其中包括查看使用不同方式插入 10 個新行的示例。最后,本文展示了一個腳本,該腳本自動化該INSERT
操作并顯示新插入的數據以供驗證。
在本系列的上一篇文章 “用 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
)。如果不清楚其中任何一個概念,在繼續本文之前您應該返回并 閱讀該文章。因為本文將介紹將數據插入表的基本原理,所以您首先需要創建準備接受新數據的表。
![]() |
|
無需將用于創建表的 SQL 命令直接輸入到 Derby ij
工具中,您可以將其放入文本文件中,并讓 ij
工具直接運行文件中的命令。本文包括一個 .zip 文件(參閱 下載 一節以訪問該文件),其中包含兩個腳本文件;一個是 derby.create.sql,如 清單 1 所示。因為本文將逐步介紹該腳本文件中的代碼行,所以您既可以參照 清單 1 所示的代碼,也可以用您偏愛的文本編輯器打開該腳本文件。
該腳本文件包括了用兩個破折號 (--
) 開頭的幾行。這些行是 SQL 注釋;您應該使用它們來提供腳本文件中每個主要組件的用途的基本描述。 腳本中的第一個實際命令是 Derby connect
命令,它告訴 ij
工具連接 test
數據庫,必要的話要先創建數據庫。下一個命令是 SQL DROP
語句,它刪除 bigdog
模式中的產品和供應商表。如果表不存在(當數據庫剛創建時就會出現這種情況),將顯示一條錯誤消息;但前面的 SQL 注釋指明,您可以安全地忽略這些消息。
如果存在的話,首先放棄這些表,以便您可以用所需的正確的列定義創建新表。后兩條 SQL 語句就執行該操作,在 bigdog
模式中創建產品和供應商表。腳本以 exit
命令結束,終止了與數據庫的連接,并允許 ij
工具優雅地退出。下一步將學習如何執行 Derby 腳本文件。
腳本文件僅在可用于執行文件中列出的命令時才有用。要執行 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 腳本文件將在本文的最后使用。
![]() |
|
清單 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 腳本文件。
![]() ![]() |
![]()
|
構建數據庫應用程序時最重要的任務之一是將數據插入到數據庫中。這與數據庫軟件的好壞無關,如果將壞數據放入數據庫中,其他一切都不重要了。有許多方法可以將數據插入數據庫中,但下文將主要使用 SQL INSERT
語句將數據插入 Apache Derby 數據庫中。
在使用 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
詞表示想要插入特定列的值。要將數據插入多列,必須將一行的數據括在逗號分隔的括號內。
下面兩節展示要實現的語法示例。
如 清單 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 新行已經插入。
多行插入優于多個單行插入;但更好的方法是將 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 |
![]() |
||||
![]() |
關于下載方法的信息 | ![]() |