備注學(xué)院

          LuLu

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            5 隨筆 :: 50 文章 :: 16 評論 :: 0 Trackbacks
          學(xué)習(xí)如何創(chuàng)建自文檔化 SQL 命令文件,通過將 SQL 命令與有用的注釋一起放置在文本文件中,可以根據(jù)需要執(zhí)行任意多次。介紹 SQL 腳本文件的基本原理之后,本文展示了三種執(zhí)行腳本文件的方法。然后您將回顧使用 SQL INSERT 語句將數(shù)據(jù)插入表中的基本原理,其中包括查看使用不同方式插入 10 個新行的示例。最后,本文展示了一個腳本,該腳本自動化該 INSERT 操作并顯示新插入的數(shù)據(jù)以供驗證。

          SQL 腳本

          在本系列的上一篇文章 “用 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 模式和兩個表(productsvendors)。如果不清楚其中任何一個概念,在繼續(xù)本文之前您應(yīng)該返回并 閱讀該文章。因為本文將介紹將數(shù)據(jù)插入表的基本原理,所以您首先需要創(chuàng)建準(zhǔn)備接受新數(shù)據(jù)的表。

          編輯 Derby SQL 腳本
          腳本文件只是一種包含可以從 Apache Derby ij 工具直接運行的 SQL 命令和 Apache Derby 命令的組合的文本文件。腳本文件簡化了 Apache Derby 數(shù)據(jù)庫的開發(fā)和維護(hù),并提供了一種用于構(gòu)建數(shù)據(jù)庫的自文檔化技術(shù)。您應(yīng)該將這些文件存儲為 ASCII 文本文件,而非 RTF 文件(或其他任何格式),以防止文本編碼錯誤。一些文本應(yīng)用程序(比如 Microsoft® Windows® 系統(tǒng)中的寫字板)可能試圖將文件自動保存為富文本文件。一定要小心這一點,否則可能在嘗試執(zhí)行腳本文件時出現(xiàn)問題。

          無需將用于創(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 腳本文件。

          在 ij 中運行腳本

          腳本文件僅在可用于執(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 腳本文件將在本文的最后使用。

          如果出問題怎么辦?
          有時候,不管您怎么努力,事情不會總是如您所愿。如果不能安全地執(zhí)行 derby.create.sql 腳本,有許多可能性需要檢查:
          • 確保 Derby ij 工具正確啟動。若非如此,您可能遇到 CLASSPATH 工具問題。
          • 確保具有創(chuàng)建新數(shù)據(jù)庫的空閑磁盤空間。
          • 確保在試圖執(zhí)行腳本文件的目錄中具有正確的權(quán)限(讀取腳本文件和創(chuàng)建新數(shù)據(jù)庫)。
          • 確保腳本文件是簡單的 ASCII 文本文件。
          如果全都不是,則檢查最新的 Derby 文檔,該文檔可從 Apache Derby Web 站點(參閱 參考資料 一節(jié)中的鏈接)上免費獲得,或在 Derby 郵件列表中詢問您的問題。

          清單 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 腳本文件。





          回頁首


          在 Apache Derby 中插入數(shù)據(jù)

          構(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 語句

          在使用 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)的語法示例。

          使用 SQL 插入數(shù)據(jù)

          清單 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、pricestockDatedescription。注意,插入到 stockDatedescription 列的值括在單引號字符中。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)插入。

          在 Apache Derby 中插入數(shù)據(jù)

          多行插入優(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$
                      





          回頁首


          結(jié)束語

          本文討論了兩個主要主題。首先向您介紹了 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)于下載方法的信息

          posted on 2007-11-27 23:39 smildlzj 閱讀(1494) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 洛隆县| 玉树县| 南岸区| 五台县| 冕宁县| 鹤庆县| 新和县| 丹凤县| 高雄县| 余庆县| 三门县| 平谷区| 平利县| 漳平市| 本溪市| 马关县| 平湖市| 科尔| 大余县| 达拉特旗| 临漳县| 荥阳市| 平果县| 沽源县| 文成县| 北海市| 田林县| 龙里县| 密云县| 三江| 新河县| 拜城县| 乃东县| 澜沧| 澎湖县| 琼海市| 庆元县| 屏东县| 定西市| 贵溪市| 无为县|