學(xué)習(xí)如何創(chuàng)建自文檔化 SQL 命令文件,通過將 SQL 命令與有用的注釋一起放置在文本文件中,可以根據(jù)需要執(zhí)行任意多次。介紹 SQL 腳本文件的基本原理之后,本文展示了三種執(zhí)行腳本文件的方法。然后您將回顧使用 SQLINSERT
語句將數(shù)據(jù)插入表中的基本原理,其中包括查看使用不同方式插入 10 個新行的示例。最后,本文展示了一個腳本,該腳本自動化該INSERT
操作并顯示新插入的數(shù)據(jù)以供驗證。
在本系列的上一篇文章 “用 Apache Derby 進(jìn)行數(shù)據(jù)庫開發(fā),第 2 部分:模式”(2006 年 4 月),在 ij
工具的提示符處直接執(zhí)行 SQL 命令。通過使用 ij
工具,可以簡單地用不同的 SQL 或 Derby 命令進(jìn)行試驗。但是,通常您將需要執(zhí)行多個復(fù)雜的命令。為了簡化調(diào)試一組復(fù)雜的 SQL 命令,將其寫入文本文件中然后一次執(zhí)行文本文件中的所有命令通常更加容易。該操作被稱為運行 SQL 腳本,可以通過使用 Apache Derby 很容易地實現(xiàn)該操作。通過將 SQL 命令放置在腳本文件中,您將獲得能夠根據(jù)需要多次執(zhí)行命令的附加好處。
腳本文件不難使用,如 清單 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 所示的腳本重新創(chuàng)建了本系列上一篇文章中演示的 bigdog
模式和兩個表(products
和 vendors
)。如果不清楚其中任何一個概念,在繼續(xù)本文之前您應(yīng)該返回并 閱讀該文章。因為本文將介紹將數(shù)據(jù)插入表的基本原理,所以您首先需要創(chuàng)建準(zhǔn)備接受新數(shù)據(jù)的表。
![]() |
|
無需將用于創(chuàng)建表的 SQL 命令直接輸入到 Derby ij
工具中,您可以將其放入文本文件中,并讓 ij
工具直接運行文件中的命令。本文包括一個 .zip 文件(參閱 下載 一節(jié)以訪問該文件),其中包含兩個腳本文件;一個是 derby.create.sql,如 清單 1 所示。因為本文將逐步介紹該腳本文件中的代碼行,所以您既可以參照 清單 1 所示的代碼,也可以用您偏愛的文本編輯器打開該腳本文件。
該腳本文件包括了用兩個破折號 (--
) 開頭的幾行。這些行是 SQL 注釋;您應(yīng)該使用它們來提供腳本文件中每個主要組件的用途的基本描述。 腳本中的第一個實際命令是 Derby connect
命令,它告訴 ij
工具連接 test
數(shù)據(jù)庫,必要的話要先創(chuàng)建數(shù)據(jù)庫。下一個命令是 SQL DROP
語句,它刪除 bigdog
模式中的產(chǎn)品和供應(yīng)商表。如果表不存在(當(dāng)數(shù)據(jù)庫剛創(chuàng)建時就會出現(xiàn)這種情況),將顯示一條錯誤消息;但前面的 SQL 注釋指明,您可以安全地忽略這些消息。
如果存在的話,首先放棄這些表,以便您可以用所需的正確的列定義創(chuàng)建新表。后兩條 SQL 語句就執(zhí)行該操作,在 bigdog
模式中創(chuàng)建產(chǎn)品和供應(yīng)商表。腳本以 exit
命令結(jié)束,終止了與數(shù)據(jù)庫的連接,并允許 ij
工具優(yōu)雅地退出。下一步將學(xué)習(xí)如何執(zhí)行 Derby 腳本文件。
腳本文件僅在可用于執(zhí)行文件中列出的命令時才有用。要執(zhí)行 SQL 腳本文件中的命令,最簡單的方法是從 ij
工具中運行腳本文件。但是,在可以運行之前,需要創(chuàng)建一個測試目錄并展開 derby4.zip 文件,該文件可在本文下載(參閱 下載 一節(jié))。該過程如 清單 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 似乎對于執(zhí)行 Derby 腳本有些冗長,但過程十分簡單。該示例假設(shè)您具有開放的終端(或Windows Command 進(jìn)程窗口,但要注意,本例中的一些步驟是特定于 UNIX® 的),并且您已經(jīng)更改到保存包含本文提供的 兩個腳本文件 的 derby4.zip 文件的目錄。要最小化任何錯誤的幾率,首先創(chuàng)建一個新目錄,將 derby4.zip 文件復(fù)制到新目錄中,并更改到這個新目錄。然后展開示例 .zip 文件。如目錄清單所示,現(xiàn)在您在新目錄中具有三個文件:derby4.zip、derby.create.sql 和 derby.insert.sql。現(xiàn)在,您將只使用 create 腳本文件; insert 腳本文件將在本文的最后使用。
![]() |
|
清單 2 的其余部分展示如何從 Derby ij
工具中執(zhí)行 derby.create.sql 腳本文件。 首先啟動 ij
工具。如果啟動時出現(xiàn)問題,您可能需要回顧 本系列第一篇文章 中提供的 Derby 安裝驗證步驟??吹?ij>
提示之后,就可以運行合適的腳本文件了。通過使用 run
命令可實現(xiàn)該操作,該命令接受單個參數(shù):單引號括起的腳本文件名。
當(dāng)該腳本執(zhí)行時,您可能會看到新 ij>
提示、命令和警告或錯誤消息的組合。這種顯示可能有些笨拙,但 run
命令會執(zhí)行您的腳本文件,就像您直接將命令鍵入 ij
工具中一樣。最后,處理 exit
命令,腳本完成,關(guān)閉 ij
工具。如果第一個腳本執(zhí)行的輸出與 清單 2 所示的相匹配,那么恭喜您了。您現(xiàn)在已經(jīng)有了一個帶有兩個可以保存數(shù)據(jù)的新表的新測試數(shù)據(jù)庫了。
雖然從 ij
工具中執(zhí)行腳本十分有效,但是有時候進(jìn)一步自動化該過程會更加容易。下一節(jié)將討論如何從命令行直接執(zhí)行 Derby 腳本文件。
本節(jié)介紹從命令行運行腳本的兩種方法。第一種方法如 清單 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 展示了直接從命令行執(zhí)行腳本文件的第一種方法。在這種情況下,提供腳本文件名作為 ij
工具的命令行參數(shù)。腳本文件中的行像以前一樣讀取,并順序處理。如果首先從 ij
工具中直接執(zhí)行 derby.create.sql 文件,現(xiàn)在在命令行運行相同目錄中的同一腳本文件,您應(yīng)該會看到類似于 清單 3 中的輸出(一切都在清單中第一行之后)。如上所示,您收到一條警告消息,指明測試數(shù)據(jù)庫未創(chuàng)建,因為它已經(jīng)存在。但是,這次您不會收到指明不能放棄兩個表的錯誤消息,因為您已經(jīng)創(chuàng)建了它們(如 清單 2 所示)。在放棄產(chǎn)品和供應(yīng)商表之后,您重新創(chuàng)建它們,腳本退出。
還有另一種方法來運行 Derby 腳本:重定向 ij
工具的標(biāo)準(zhǔn)輸入以從腳本文件中讀取。在基于 UNIX 的操作系統(tǒng)中,通過使用適合您的 shell 的 STDIN 重定向字符最容易實現(xiàn)了,比如為 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 中可以看到,當(dāng)您通過重定向 ij
工具的標(biāo)準(zhǔn)輸入執(zhí)行腳本時,惟一顯示的文本是來自 ij
工具的消息,其中包括 0 rows inserted/updated/deleted
等信息消息或警告和錯誤消息。如果想要消除這些消息,可以重定向 ij
工具的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤。例如,如果正在 Bash shell 中工作,則可以使用
java org.apache.derby.tools.ij < derby.create.sql > derby.create.out 2> derby.create.err
實現(xiàn)這一點,它運行 derby.create.sql 腳本文件,將輸出消息保存到 derby.create.out
中,并將所有 ij
錯誤消息保存到 derby.create.err
中。
現(xiàn)在您將關(guān)注使用 Apache Derby 將數(shù)據(jù)插入表的過程。要繼續(xù)進(jìn)行,您需要一個 Derby 數(shù)據(jù)庫,它必須具有可用的產(chǎn)品表。如果您還未實現(xiàn)此步驟,您需要執(zhí)行 derby.create.sql 腳本文件。
![]() ![]() |
![]()
|
構(gòu)建數(shù)據(jù)庫應(yīng)用程序時最重要的任務(wù)之一是將數(shù)據(jù)插入到數(shù)據(jù)庫中。這與數(shù)據(jù)庫軟件的好壞無關(guān),如果將壞數(shù)據(jù)放入數(shù)據(jù)庫中,其他一切都不重要了。有許多方法可以將數(shù)據(jù)插入數(shù)據(jù)庫中,但下文將主要使用 SQL INSERT
語句將數(shù)據(jù)插入 Apache Derby 數(shù)據(jù)庫中。
在使用 SQL INSERT
語句將數(shù)據(jù)插入 Apache Derby 數(shù)據(jù)庫中之前,必須知道如果正確地使用該語句。清單 5 提供了 Apache Derby 中 SQL INSERT
語句的完整語法。
清單 5. SQL INSERT 語法
INSERT INTO table-Name [ (Simple-column-Name [ , Simple-column-Name]* ) ] Expression |
該語法應(yīng)該比較熟悉。如本系列的 上一篇文章 所述,方括號 ([
]
) 包括可選參數(shù)。其用途不是立即清楚的惟一組件是 Expression
;但這個簡單的短語能夠有多復(fù)雜呢?當(dāng)然,外表可能會蒙蔽人;Expression
詞可以擴(kuò)展為下列四個不同的結(jié)構(gòu)之一:
- 單行
VALUES
列表 - 多行
VALUES
列表 SELECT
表達(dá)式UNION
表達(dá)式
其中,最后兩個超出了本文范圍,將在后續(xù)文章中詳細(xì)介紹。前兩個相似;惟一的區(qū)別在于第一種形式將一行插入表中,而后一種形式將多行插入表中。
可以使用 SQL INSERT
語句的可選部分指定要插入到表中的值的列順序。默認(rèn)情況下,數(shù)據(jù)插入到表中的列順序與創(chuàng)建表時列的列出順序相同。有時候您希望更改這種順序或可能希望只為具有 NOT NULL
約束的列指定值。通過在 SQL INSERT
語句中顯式列出列,您將獲得對操作的更多控制,并可以更容易地處理這些特定的用例。
SQL VALUES
表達(dá)式的語法相當(dāng)簡單,如 清單 6 所示。
清單 6. SQL VALUES 語法
{ VALUES ( Value {, Value }* ) [ , ( Value {, Value }* ) ]* | VALUES Value [ , Value ]* } |
該語法首先顯示多行格式,然后是單行格式(記住,豎線字符 |
表示或者,星號字符 *
表示一個或多個)。value
詞表示想要插入特定列的值。要將數(shù)據(jù)插入多列,必須將一行的數(shù)據(jù)括在逗號分隔的括號內(nèi)。
下面兩節(jié)展示要實現(xiàn)的語法示例。
如 清單 7 所示,要將數(shù)據(jù)插入表中,首先需要啟動 ij
工具并連接數(shù)據(jù)庫。記住,要將數(shù)據(jù)插入表中,表必須存在。如果還沒有表的話,則執(zhí)行本文之前所述的用于創(chuàng)建表的腳本。
清單 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
列是長度可變的字符串,所以它預(yù)計是一個字符串(通過將字符數(shù)據(jù)括在單引號中指明)。另一方面,stockDate
列是一個日期列;它需要您將日期括在單引號中以正確解析出正確的日、月和年信息。(有關(guān) SQL INSERT
操作期間數(shù)據(jù)類型格式的更多指南,請閱讀聯(lián)機(jī)文檔或參閱本系列的 上一篇文章。)
第二個 SQL INSERT
語句顯式列出所有四列并相應(yīng)地插入新值。最后一個 SQL INSERT
語句只列出三列并只插入三個值。description
列留為空白,這意味著它將具有 NULL
值。
雖然單行 SQL INSERT
語句可能有用,但當(dāng)您需要插入多行時,直接插入多行可能更有效,如 清單 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
工具并連接數(shù)據(jù)庫。下一代碼行通過顯式列出所有四列并為每行提供新值,將 7 行插入數(shù)據(jù)庫中。如前所述,多行插入將每個新行的值包括在括號內(nèi),這些值之間用逗號分隔。該 SQL INSERT
語句執(zhí)行之后,ij
工具報告這 7 新行已經(jīng)插入。
多行插入優(yōu)于多個單行插入;但更好的方法是將 SQL INSERT
語句放在腳本文件中,運行腳本來插入數(shù)據(jù)。這種方法允許您更容易地修復(fù)錯誤或根據(jù)需要重新插入數(shù)據(jù),而無需重新創(chuàng)建必需的 SQL INSERT
語句。如前所述,可以 隨本文下載 的 .zip 文件包括兩個 SQL 腳本文件。第二個腳本文件 (derby.insert.sql) 將上一節(jié)提供的 10 行插入到數(shù)據(jù)庫中,并執(zhí)行簡單查詢以顯示結(jié)果,從而驗證插入操作。執(zhí)行查詢操作的機(jī)制將在下一篇文章中詳細(xì)討論,但您不必理解查詢就能夠運行插入腳本。
要執(zhí)行腳本,可以選擇本文開頭展示的三個方法之一。在 清單 9 中,通過重定向 ij
工具的標(biāo)準(zhǔn)輸入以從腳本文件中讀取的方式,來執(zhí)行插入腳本。插入 10 行,然后結(jié)果顯示到屏幕上。
清單 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 腳本文件的概念,該腳本文件可用于以自動方式執(zhí)行多個 SQL(或 Derby)命令。使用 Apache Derby ij
工具執(zhí)行 SQL 腳本文件有三種方法:從工具中、使用 run
命令或直接從命令行使用這兩種方法之一。然后,您回顧了 INSERT
語句的 SQL 語法,并查看了如何使用該語句將數(shù)據(jù)插入 Derby 數(shù)據(jù)庫中的示例。后續(xù)文章將在此基礎(chǔ)上查詢、更新和刪除 Apache Derby 數(shù)據(jù)庫中的數(shù)據(jù)。
![]() ![]() |
![]()
|
描述 | 名字 | 大小 | 下載方法 |
---|---|---|---|
Derby SQL scripts for this article | derby4.zip | 1KB | HTTP |
![]() |
||||
![]() |
關(guān)于下載方法的信息 | ![]() |