<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                **目錄** [TOC] # 1 建立表格 在建立好數據庫以后,就可以根據儲存資料的需求,使用SQL敘述建立所有需要的表格(table)。建立表格的設定非常多,以建立“world.city”表格來說,它的敘述會像這樣: [![mysql_09_snap_01](http://box.kancloud.cn/2015-09-15_55f7e96e360eb.png)](http://box.kancloud.cn/2015-09-15_55f7e96e360eb.png) 根據不同的需求,建立表格的語法有好幾種,下列是建立表格基本的語法: [![mysql_09_snap_02](http://box.kancloud.cn/2015-09-15_55f7e96f0dfb2.png)](http://box.kancloud.cn/2015-09-15_55f7e96f0dfb2.png) MySQL規定一個表格中至少要有一個字段,在設定表格中的字段時,至少要明確的決定字段的名稱與型態,其它的字段設定都是選擇性的,如果有一個以上字段,要使用逗號隔開: [![mysql_09_snap_03](http://box.kancloud.cn/2015-09-15_55f7e96f50f47.png)](http://box.kancloud.cn/2015-09-15_55f7e96f50f47.png) 使用需要的資料型態,就可以建立一個可以儲存親友通訊錄的表格: [![mysql_09_snap_04](http://box.kancloud.cn/2015-09-15_55f7e975143ff.png)](http://box.kancloud.cn/2015-09-15_55f7e975143ff.png) 建立表格的時候可以使用“IF NOT EXISTS”選項,預防發生表格已存在的錯誤: [![mysql_09_snap_05](http://box.kancloud.cn/2015-09-15_55f7e97619ce9.png)](http://box.kancloud.cn/2015-09-15_55f7e97619ce9.png) ## 1.1 表格屬性 建立表格的時候也可以為表格加入需要的表格屬性(table attributes)設定,這里會先討論關于儲存引擎、字符集和collation的屬性設定。如果你在建立表格的時侯,沒有指定這些屬性,MySQL會使用服務器默認的儲存引擎作為表格的儲存引擎,字符集與collation會使用數據庫默認的設定。 你可以針對表格的需求,設定它使用的儲存引擎、字符集與collation: [![mysql_09_snap_06](http://box.kancloud.cn/2015-09-15_55f7e97696d08.png)](http://box.kancloud.cn/2015-09-15_55f7e97696d08.png) 下列的敘述在建立“addressbook”表格的時候,使用“ENGINE”、“CHARCTER SET”和“COLLATE”設定表格自己使用的儲存引擎、字符集與collation: [![mysql_09_snap_07](http://box.kancloud.cn/2015-09-15_55f7e976dfaf5.png)](http://box.kancloud.cn/2015-09-15_55f7e976dfaf5.png) 注:根據語法的說明,“CHARCTER SET”也可以使用比較簡短的“CHARSET”;另外在設定時都可以省略“=”。 MySQL數據庫服務器支援許多不同應用的儲存引擎,你可以使用“SHOW ENGINES”查詢: [![mysql_09_snap_08](http://box.kancloud.cn/2015-09-15_55f7e97769f6a.png)](http://box.kancloud.cn/2015-09-15_55f7e97769f6a.png) 在建立表格的時候,如果沒有使用“ENGINE”設定儲存引擎,那就會使用MySQL數據庫服務器默認的儲存引擎。你可以使用下列的方式修改MySQL數據庫服務器默認的儲存引擎設定: * 修改設定檔:MySQL數據庫服務器在啟動時會讀取一個名稱為“my.ini”的設定檔,檔案中有許多啟動數據庫服務器時需要的資訊。其中就包含默認的儲存引擎設定,你可以修改這個設定后再重新啟動數據庫服務器,讓新的設定生效: [![mysql_09_snap_09](http://box.kancloud.cn/2015-09-15_55f7e9782a5ca.png)](http://box.kancloud.cn/2015-09-15_55f7e9782a5ca.png) * 設定儲存引擎:你也可以使用“SET”敘述設定默認的儲存引擎: [![mysql_09_snap_10](http://box.kancloud.cn/2015-09-15_55f7e97854eab.png)](http://box.kancloud.cn/2015-09-15_55f7e97854eab.png) 在建立表格時指定字符集與collation會有一些不同的組合。如果只有指定字符集,MySQL會使用你指定字符集的默認collation: [![mysql_09_snap_11](http://box.kancloud.cn/2015-09-15_55f7e98d6cb22.png)](http://box.kancloud.cn/2015-09-15_55f7e98d6cb22.png) 如果只有使用“COLLATE”指定collation,MySQL會使用你指定collation所屬的字符集: [![mysql_09_snap_12](http://box.kancloud.cn/2015-09-15_55f7e997cd707.png)](http://box.kancloud.cn/2015-09-15_55f7e997cd707.png) 注:建立表格的時候,不管你有沒有指定,表格都會有字符集與collation的設定。在這個表格中的“非二進位制、non-binary”字串型態字段,還有“ENUM”與“SET”型態字段,都會使用表格默認的字符集與collation。 ## 1.2 字串字段屬性 如果一個字段的型態是字串的話,你還可以依照需求加入字串型態的字段屬性(column attributes)。“非二進位制、non-binary”字串可以額外設定字符集與collation: [![mysql_09_snap_13](http://box.kancloud.cn/2015-09-15_55f7e99865dcb.png)](http://box.kancloud.cn/2015-09-15_55f7e99865dcb.png) 每一個表格都會有一個默認的字符集與collation設定,如果沒有指定字段的字符集與collation,就會使用默認的設定: [![mysql_09_snap_14](http://box.kancloud.cn/2015-09-15_55f7e998a970e.png)](http://box.kancloud.cn/2015-09-15_55f7e998a970e.png) ## 1.3 數值字段屬性 數值型態字段專用的屬性設定有“UNSIGNED”、“ZEROFILL”與“AUTO_INCREMENT”: [![mysql_09_snap_15](http://box.kancloud.cn/2015-09-15_55f7e998f236f.png)](http://box.kancloud.cn/2015-09-15_55f7e998f236f.png) 注:數值型態字段設定為“UNSIGNED”與“ZEROFILL”的效果在“第八章、表格與索引、建立表格、數值字段屬性”中已經討論過;而“AUTO_INCREMENT”的設定與索引有關,所以在這一章后面索引的部份一起討論。 ## 1.4 通用字段屬性 除了字串與數值兩種字段專用的字段屬性設定外,還有許多可以用在所有型態的字段屬性: [![mysql_09_snap_16](http://box.kancloud.cn/2015-09-15_55f7e999d8a69.png)](http://box.kancloud.cn/2015-09-15_55f7e999d8a69.png) “NOT NULL”字段屬性可以用來禁止某個字段儲存“NULL”值,一般來說,“NULL”值用來表示一個字段的資料是“不確定”、“未知”或“沒有”。不過有一些字段并不能出現“NULL”值,不然就會成為一筆很奇怪的紀錄了: [![mysql_09_snap_17](http://box.kancloud.cn/2015-09-15_55f7e99b09fa4.png)](http://box.kancloud.cn/2015-09-15_55f7e99b09fa4.png) 使用“NULL”或“NOT NULL”設定字段屬性后,在查詢表格字段資訊時,是在“Null”字段用“YES”或“NO”來表示: [![mysql_09_snap_18](http://box.kancloud.cn/2015-09-15_55f7e9a5620f5.png)](http://box.kancloud.cn/2015-09-15_55f7e9a5620f5.png) 如果一個表格中,有設定為“NOT NULL”的字段,那就要注意你在新增或修改紀錄時指定的資料,不能夠違反這些規則: [![mysql_09_snap_19](http://box.kancloud.cn/2015-09-15_55f7e9a7717fd.png)](http://box.kancloud.cn/2015-09-15_55f7e9a7717fd.png) 使用“DEFAULT”關鍵字可以設定字段的默認值,你可以自己指定任何想要的默認值,在新增或修改資料的時候都有可能會使用到字段的默認值。要特別注意的是MySQL限制你的默認值只能是“一個明確的值”,也就是默認值的設定不可以使用任何函式或運算式。 如果你沒有為字段使用“DEFAULT”關鍵字設定默認值,而且也沒有設定為“NOT NULL”,MySQL會自動為你加入默認值的設定: [![mysql_09_snap_20](http://box.kancloud.cn/2015-09-15_55f7e9a977758.png)](http://box.kancloud.cn/2015-09-15_55f7e9a977758.png) 以通訊錄表格來說,如果紀錄的地址大部份都是“Taipei”的話,你可以為“address”字段設定一個默認值: [![mysql_09_snap_22](http://box.kancloud.cn/2015-09-15_55f7e9a9d5111.png)](http://box.kancloud.cn/2015-09-15_55f7e9a9d5111.png) 使用“DEFAULT”關鍵字加入默認值的設定以后,就可以在新增或修改資料的時候使用: 默認值的設定要注意下列的規則: * “BLOB”與“TEXT”字段型態不可以使用[DEFAULT]關鍵字指定默認值,其它的字段型態都可以 * 不能與其它的字段設定造成沖突。例如一個設定為“NOT NULL”的字段,卻使用“DEFAULT NULL”設定默認值為“NULL” * 指定的默認值要符合字段型態。例如“DATE”型態字段使用“DEFAULT ‘Hello!’”指定默認值 注:“UNIQUE KEY”與“PRIMARY KEY”在這一章后面索引的部份一起討論。 ## 1.5 TIMESTAMP字段型態與默認值 “TIMESTAMP”字段是日期時間資料的一種,它除了具有“時區、timezone”的特性外,也可以搭配“DEFAULT”和“ON UPDATE”來完成一些比較特殊的需求: [![mysql_09_snap_23](http://box.kancloud.cn/2015-09-15_55f7e9aaa6eea.png)](http://box.kancloud.cn/2015-09-15_55f7e9aaa6eea.png) 在表格中使用“TIMESTAMP”型態的字段時,如果你沒有設定它們的字段屬性,MySQL會自動幫你在第一個“TIMESTAMP”字段加入“NOT NULL”、“DEFAULT”和“ON UPDATE”三個字段屬性的設定。 * “NOT NULL”不允許你儲存“NULL”值 * “DEFAULT CURRENT_TIMESTAMP”設定默認值為目前的日期時間。在所有字段型態中,只有“TIMESTAMP”可以使用“CURRENT_TIMESTAMP”指定默認值;其它的字段型態,在指定默認值只能是“一個明確的值” * “ON UPDATE”可以指定在修改紀錄的時候,MySQL自動幫你填入的資料 其它沒有設定字段屬性的“TIMESTAMP”字段,MySQL會幫你加入“NOT NULL”與“DEFAULT”兩個字段屬性。 “DEFAULT CURRENT_TIMESTAMP”字段屬性的效果,在你新增紀錄的時候就可以看得出來了: [![mysql_09_snap_24](http://box.kancloud.cn/2015-09-15_55f7e9ab1fe9f.png)](http://box.kancloud.cn/2015-09-15_55f7e9ab1fe9f.png) 而“ON UPDATE CURRENT_TIMESTAMP”字段屬性,會在修改紀錄的時候產生效果: [![mysql_09_snap_25](http://box.kancloud.cn/2015-09-15_55f7e9abeae78.png)](http://box.kancloud.cn/2015-09-15_55f7e9abeae78.png) “TIMESTAMP”字段型態很適合用來記錄資料新增或修改的日期與時間。可是如果在同一筆紀錄中,要使用一個字段記錄新增資料的日期與時間,而使用另一個字段記錄修改資料的日期與時間。為了應付這樣的需求,你應該會使用下列的字段定義: [![mysql_09_snap_26](http://box.kancloud.cn/2015-09-15_55f7e9acd19e8.png)](http://box.kancloud.cn/2015-09-15_55f7e9acd19e8.png) 在一個表格中,MySQL限制“CURRENT_TIMESTAMP”只能在一個字段出現,所以當有這樣的需求出現時,你必須使用MySQL提供給你的特殊設定方式來解決: [![mysql_09_snap_27](http://box.kancloud.cn/2015-09-15_55f7e9ae46448.png)](http://box.kancloud.cn/2015-09-15_55f7e9ae46448.png) 建立好這樣的表格以后,看起來雖然怪怪的,不過當你指定“created”字段的值為“NULL”的時候,MySQL會自動為你填入目前的日期與時間: [![mysql_09_snap_28](http://box.kancloud.cn/2015-09-15_55f7e9aea8acf.png)](http://box.kancloud.cn/2015-09-15_55f7e9aea8acf.png) 后續在修改資料的時候,就只會在“updated”字段填入目前的日期與時間: [![mysql_09_snap_29](http://box.kancloud.cn/2015-09-15_55f7e9af56271.png)](http://box.kancloud.cn/2015-09-15_55f7e9af56271.png) ## 1.6 使用其它表格建立一個新表格 在數據庫中建立需要的表格,通常是使用上列討論的方式,根據自己的需求,建立一個新的表格來儲存需要保存的資料;在一些比較特別的情況,你可能會使用一個現有的表格來建立新的表格,這樣的需求可以使用下列的語法: [![mysql_09_snap_30](http://box.kancloud.cn/2015-09-15_55f7e9afe74b6.png)](http://box.kancloud.cn/2015-09-15_55f7e9afe74b6.png) 以“world”數據庫中的“city”來說,下列的查詢敘述可以傳回臺灣的城市與人口數: [![mysql_09_snap_31](http://box.kancloud.cn/2015-09-15_55f7e9b07a901.png)](http://box.kancloud.cn/2015-09-15_55f7e9b07a901.png) 如果你想要建立一個新表格,這個表格中的資料就是上列查詢的結果,就可以使用這種建立表格的語法: [![mysql_09_snap_32](http://box.kancloud.cn/2015-09-15_55f7e9b103012.png)](http://box.kancloud.cn/2015-09-15_55f7e9b103012.png) 使用這種語法建立的新表格,可以省略字段定義的工作,新表格會使用原有表格的字段名稱與定義,而且在查詢敘述中傳回的資料,會直接新增到新建立的表格中: [![mysql_09_snap_33](http://box.kancloud.cn/2015-09-15_55f7e9b2f2a9f.png)](http://box.kancloud.cn/2015-09-15_55f7e9b2f2a9f.png) 你也可以在建立新表格的時候,使用字段定義來設定新表格的字段型態與其它屬性: [![mysql_09_snap_34](http://box.kancloud.cn/2015-09-15_55f7e9bda4e7a.png)](http://box.kancloud.cn/2015-09-15_55f7e9bda4e7a.png) 如果需要的話,也可以加入查詢敘述中沒有的字段: [![mysql_09_snap_35](http://box.kancloud.cn/2015-09-15_55f7e9be389b4.png)](http://box.kancloud.cn/2015-09-15_55f7e9be389b4.png) 使用這種語法建立表格時有下列幾個重點: * MySQL使用查詢結果的字段名稱與型態來建立新的表格 * 如果沒有指定儲存引擎、字符集或collation的話,建立的新表格使用數據庫默認的儲存引擎、字符集與collation * 查詢表格中,字段的索引與“AUTO_INCREMENT”設定都會被忽略 如果只需要借用一個已經存在的表格字段定義,可是并不需要紀錄資料的話,你可以使用下列的語法來建立新表格: [![mysql_09_snap_36](http://box.kancloud.cn/2015-09-15_55f7e9beb1a3b.png)](http://box.kancloud.cn/2015-09-15_55f7e9beb1a3b.png) 使用這種語法建立的新表格,并不會新增紀錄到新表格中,可是包含索引與“AUTO_INCREMENT”設定都會套用在新表格,除了下列兩個例外: * 使用“MyISAM”儲存引擎時,你可以在建立表格的時候使用“DATA DIRECTORY”與“INDEX DIRECTORY”指定資料與索引檔案的資料夾位置;建立的新表格會忽略這些設定,而使用數據庫默認的資料夾 * 字段的“FOREIGN KEY”與表格的“REFERENCES”屬性設定都會被忽略 ## 1.7 建立暫存表格 上列討論的建立表格方式,都可以在建立表格的時候,依照需要加入“TEMPORARY”關鍵字,指定這個新建立的表格為“用戶端暫時存在”的表格: [![mysql_09_snap_37](http://box.kancloud.cn/2015-09-15_55f7e9bf3fbbd.png)](http://box.kancloud.cn/2015-09-15_55f7e9bf3fbbd.png) “TEMPORARY”表格有下列重點: * “TEMPORARY”表格是每一個用戶端專屬的表格,用戶端離線后,MySQL就會自動刪除這些表格 * 因為“TEMPORARY”表格是用戶端專屬的表格,其它用戶端不能使用,所以不同的用戶端,使用同樣名稱建立“TEMPORARY”表格也沒有關系 * “TEMPORARY”表格名稱可以跟數據庫中的表格名稱一樣,不過在“TEMPORARY”表格存在的時候,數據庫中的表格會被隱藏起來 * 可以使用“ALTER TABLE”修改“TEMPORARY”表格名稱,不可以使用“RENAME TABLE”修改“TEMPORARY”表格名稱 # 2 修改表格 使用“CREATE TABLE”敘述建立表格以后,如果發現某個字段或設定打錯,或是在使用一陣子以后,發覺表格中有一些設定不太對。在這些情況下,你可以使用“ALTER TABLE”敘述來修改一個表格的結構: [![mysql_09_snap_38](http://box.kancloud.cn/2015-09-15_55f7e9bf6a030.png)](http://box.kancloud.cn/2015-09-15_55f7e9bf6a030.png) ## 2.1 增加字段 你可以使用下列的修改定義增加一個本來沒有的字段: [![mysql_09_snap_39](http://box.kancloud.cn/2015-09-15_55f7e9bfb77d8.png)](http://box.kancloud.cn/2015-09-15_55f7e9bfb77d8.png) 如果你在增加字段的時候,沒有指定新增字段的位置,MySQL會把這個字段放在最后一個: [![mysql_09_snap_40](http://box.kancloud.cn/2015-09-15_55f7e9bfebdf3.png)](http://box.kancloud.cn/2015-09-15_55f7e9bfebdf3.png) 你可以搭配使用“FIRST”關鍵字,把新增的字段放在第一個: [![mysql_09_snap_41](http://box.kancloud.cn/2015-09-15_55f7e9c069f0a.png)](http://box.kancloud.cn/2015-09-15_55f7e9c069f0a.png) 或是使用“AFTER”關鍵字,指定新增的字段要放在哪一個字段后面: [![mysql_09_snap_42](http://box.kancloud.cn/2015-09-15_55f7e9c126aa3.png)](http://box.kancloud.cn/2015-09-15_55f7e9c126aa3.png) 如果需要增加多個字段的話,也可以使用下列的語法一次把需要新增的字段,全部加到表格中;不過這種語法加入的新字段,都會放在最后面的位置: [![mysql_09_snap_43](http://box.kancloud.cn/2015-09-15_55f7e9c1cd399.png)](http://box.kancloud.cn/2015-09-15_55f7e9c1cd399.png) 注:“ALTER TABLE”敘述也可以用來增加索引,在這一章后面索引的部份一起討論。 ## 2.2 修改字段 如果需要修改字段的名稱、型態、大小范圍或其它字段屬性,你可以使用下列兩種修改定義來執行修改的工作。“CHANGE”可以修改字段的名稱與定義,“MODIFY”只能修改字段的定義,不能修改字段名稱: [![mysql_09_snap_44](http://box.kancloud.cn/2015-09-15_55f7e9c28a4d6.png)](http://box.kancloud.cn/2015-09-15_55f7e9c28a4d6.png) 以下列使用“CHANGE”關鍵字修改表格的敘述來說,它將“one”字段的名稱修改為“changecolumn”,型態從“INT”修改為“BIGINT”,而且把修改后的字段位置放在“two”字段后面: [![mysql_09_snap_45](http://box.kancloud.cn/2015-09-15_55f7e9e0eb944.png)](http://box.kancloud.cn/2015-09-15_55f7e9e0eb944.png) 下列使用“MODIFY”關鍵字修改表格的敘述,它將“two”字段的型態從“INT”修改為“BIGINT”,而且把修改后的字段位置放在“three”字段后面: [![mysql_09_snap_46](http://box.kancloud.cn/2015-09-15_55f7e9e189a4a.png)](http://box.kancloud.cn/2015-09-15_55f7e9e189a4a.png) ## 2.3 刪除字段 如果要刪除一個表格中不需要的字段,可以使用下列的修改定義: [![mysql_09_snap_47](http://box.kancloud.cn/2015-09-15_55f7e9ece038d.png)](http://box.kancloud.cn/2015-09-15_55f7e9ece038d.png) 下列格的敘述會刪除“two”字段: [![mysql_09_snap_48](http://box.kancloud.cn/2015-09-15_55f7e9f71f1dd.png)](http://box.kancloud.cn/2015-09-15_55f7e9f71f1dd.png) ## 2.4 修改表格名稱 如果需要修改表格的名稱,你可以使用下列兩種敘述,包含在“ALTER TABLE”敘述中使用修改表格名稱的修改定義;或是使用“RENAME TABLE”敘述: [![mysql_09_snap_49](http://box.kancloud.cn/2015-09-15_55f7e9f7af503.png)](http://box.kancloud.cn/2015-09-15_55f7e9f7af503.png) 下列兩個敘述都可以把“mytable”表格名稱修改為“mynewtable”: [![mysql_09_snap_50](http://box.kancloud.cn/2015-09-15_55f7e9f86275c.png)](http://box.kancloud.cn/2015-09-15_55f7e9f86275c.png) # 3 刪除表格 你可以使用下列的敘述刪除一個不需要的表格: [![mysql_09_snap_51](http://box.kancloud.cn/2015-09-15_55f7e9f90fb7d.png)](http://box.kancloud.cn/2015-09-15_55f7e9f90fb7d.png) 注:使用“DROP TABLE”敘述執行刪除表格的工作時,MySQL并不會再次跟你確認是否真的要刪除,而是真的就直接刪除了,表格儲存的紀錄資料當然也不見了。 # 4 索引介紹 數據庫與表格是MySQL數據庫的基本元件,依照需求建立好的數據庫與表格后,就可以使用它們來為你保存資料。一個設計良好的數據庫,不論是資料的正確性,還有后續的維護與查詢都比較不會發生問題。除了好好規劃與建立數據庫與表格外,你還可以利用“索引、index”預防你的資料出現問題,尤其是表格儲存非常大量的紀錄時,建立適當的索引,可以增加查詢與維護資料的效率。 以“MyISAM”儲存引擎來說,資料表的儲存的紀錄資料,是儲存在電腦中的一個檔案: [![mysql_09_snap_52](http://box.kancloud.cn/2015-09-15_55f7e9f986e02.png)](http://box.kancloud.cn/2015-09-15_55f7e9f986e02.png) 當你執行一個像這樣的查詢敘述時: [![mysql_09_snap_53](http://box.kancloud.cn/2015-09-15_55f7e9f9e2355.png)](http://box.kancloud.cn/2015-09-15_55f7e9f9e2355.png) 數據庫要找到你需要查詢或維護的紀錄,如果沒有索引幫助的話,就會從頭開始一邊讀取,一邊判斷是否有符合條件的資料。你可以為表格建立索引來改善這種比較沒有效率的方式: [![mysql_09_snap_54](http://box.kancloud.cn/2015-09-15_55f7e9faa4155.png)](http://box.kancloud.cn/2015-09-15_55f7e9faa4155.png) 建立城市名稱的索引檔以后,同樣執行下列的查詢敘述,MySQL會自動使用索引來快速找到你需要的資料: [![mysql_09_snap_55](http://box.kancloud.cn/2015-09-15_55f7ea053b854.png)](http://box.kancloud.cn/2015-09-15_55f7ea053b854.png) 注:索引同樣可以增加刪除或修改的效率。 索引分為主索引鍵(primary key)、唯一索引(unique index)與非唯一索引(non-unique index)三種。 主索引鍵的應用很常見,而且一個表格通常會有一個,而且只能有一個。在一個表格中,設定為主索引鍵的字段值不可以重復,而且不可以儲存“NULL”值。因為這樣的限制,所以很適合使用在類似編碼、代號或身份證字號這類字段。 唯一索引也稱為“不可重復索引”,在一個表格中,設定為唯一索引的字段值不可以重復,但是可以儲存“NULL”值。這種索引適合用在類似員工資料表格中儲存電子郵件帳號的字段,因為員工不一定有電子郵件帳號,所以允許儲存“NULL”值,可以每一個員工的電子郵件帳號都不可以重復。 上列兩種索引都可以預防儲存的資料發生重復的問題,也可以增加查詢與維護資料的效率。非唯一索引就只是用來增加查詢與維護資料效率的索引。設定為非唯一索引的字段值可以重復,也可以儲存“NULL”值。 # 5 建立索引 MySQL提供許多不同的方式讓你建立需要的索引。通常在規劃一個數據庫的時候,會把表格所需要的索引一并規劃好,在這樣的情況下,你可以把建立索引的定義,加在“CREATE TABLE”敘述中,建立表格的時候就一起把索引建立好;不過也有可能在使用表格一陣子以后,才發覺有建立索引的需求,在這樣的情況下,你可以使用“ALTER TABLE”或“CREATE INDEX”建立需要的索引。 ## 5.1 在建立表格的時候建立索引 在建立表格的敘述中,你會定義出許多表格所需要的字段,在字段的定義中,除了名稱、型態與屬性,還可以加入“唯一索引”與“主索引鍵”的定義: [![mysql_09_snap_56](http://box.kancloud.cn/2015-09-15_55f7ea106abb5.png)](http://box.kancloud.cn/2015-09-15_55f7ea106abb5.png) 以下列這個建立儲存聯絡簿的表格來說,你可以使用這樣的語法在“id”字段后面加入“PRIMARY KEY”,指定“id”字段為主索引鍵,這表示“id”字段的值不可以重復,而且不可以儲存“NULL”值;另外在“email”字段加入“UNIQUE KEY”,指定“email”字段為唯一索引,這表示“email”字段的值不可以重復: [![mysql_09_snap_57](http://box.kancloud.cn/2015-09-15_55f7ea10dc464.png)](http://box.kancloud.cn/2015-09-15_55f7ea10dc464.png) 下列是另外一種在“CREATE TABLE”敘述中建立索引的語法: [![mysql_09_snap_58](http://box.kancloud.cn/2015-09-15_55f7ea2047a64.png)](http://box.kancloud.cn/2015-09-15_55f7ea2047a64.png) 同樣以建立儲存聯絡簿的表格來說,下列兩種建立索引語法的效果是一樣的: [![mysql_09_snap_59](http://box.kancloud.cn/2015-09-15_55f7ea21091ed.png)](http://box.kancloud.cn/2015-09-15_55f7ea21091ed.png) 如果你要建立一般索引(可以重復的索引),或是要建立包含多個字段的索引時,就一定要把建立索引的定義加在所有字段定義后面: [![mysql_09_snap_60](http://box.kancloud.cn/2015-09-15_55f7ea21a0879.png)](http://box.kancloud.cn/2015-09-15_55f7ea21a0879.png) 在建立索引的時候,你可以指定某一個字段為建立索引的字段,不過有時候你只想要為一個字串型態字段的部份資料建立索引,或是指定建立的索引資料,是要依照由小到大,還是由大到小排列。有這樣的需求時,你可以依照下列的語法來指定: [![mysql_09_snap_61](http://box.kancloud.cn/2015-09-15_55f7ea2286e33.png)](http://box.kancloud.cn/2015-09-15_55f7ea2286e33.png) 以建立聯絡簿的表格來說,為地址資料“address”字段建立索引的時候,如果你希望建立地址前五個字符的索引資料,而且依照由大到小的順序。下列的敘述就可以建立這樣的索引: [![mysql_09_snap_62](http://box.kancloud.cn/2015-09-15_55f7ea232ed70.png)](http://box.kancloud.cn/2015-09-15_55f7ea232ed70.png) 注:只有“CHAR”、“VARCHAR”、“BINARY”與“VARBINARY”型態的字段可以指定制作索引的長度。“ASC”或“DESC”可以使用在任何型態的字段。 如果一個表格使用的儲存引擎是“MEMORY”的話,建立索引的時候還可以額外指定索引使用的“算法、algorithm”。使用其它儲存引擎的表格,MySQL會忽略這個設定。索引使用的算法有“BTREE”與“HASH”兩種,你可以使用下列的語法來指定索引使用的算法: [![mysql_09_snap_63](http://box.kancloud.cn/2015-09-15_55f7ea28d2db9.png)](http://box.kancloud.cn/2015-09-15_55f7ea28d2db9.png) 默認的“HASH”算法適合用在主索引鍵和唯一索引,這種算法在搜尋不能重復的資料時,效率會比較好;而“BTREE”算法適合用在可以允許重復資料的一般索引,在搜尋上會比“HASH”有更好的效率。 注:“FULLTEXT”索引只能用在“CHAR”、“VARCHAR”與“TEXT”型態的字段,而且表格使用的儲存引擎必須是“MyISAM”。“SPATIAL”索引是“SPATIAL”型態字段專用的,而且表格使用的儲存引擎必須是“MyISAM”。這兩種索引不會在這里討論。 ## 5.2 在修改表格的時候建立索引 如果你想要為一個已經存在的表格建立索引的話,你可以在修改表格“ALTER TABLE”中建立索引: [![mysql_09_snap_64](http://box.kancloud.cn/2015-09-15_55f7ea2eb0db8.png)](http://box.kancloud.cn/2015-09-15_55f7ea2eb0db8.png) 以下列的范例來說,在建立聯絡簿表格時沒有建立索引,你可以使用“ALTER TABLE”敘述建立需要的索引,不過一個“ALTER TABLE”敘述只能建立一個索引: [![mysql_09_snap_67](http://box.kancloud.cn/2015-09-15_55f7ea354b0f0.png)](http://box.kancloud.cn/2015-09-15_55f7ea354b0f0.png) ## 5.3 使用“CREATE INDEX”建立索引 需要為一個已經存在的表格建立索引,除了使用“ALTER TABLE”敘述建立索引外,還可以使用“CREATE INDEX”敘述建立唯一索引與一般索引: [![mysql_09_snap_66](http://box.kancloud.cn/2015-09-15_55f7ea363c177.png)](http://box.kancloud.cn/2015-09-15_55f7ea363c177.png) 使用“CREATE INDEX”敘述只能建立唯一索引與一般索引,你還是要使用“ALTER TABLE”敘述建立主索引鍵: [![mysql_09_snap_67](http://box.kancloud.cn/2015-09-15_55f7ea354b0f0.png)](http://box.kancloud.cn/2015-09-15_55f7ea354b0f0.png) 為一個已經存在的表格建立索引時,要特別注意主索引鍵與唯一索引這兩種索引。如果這個表格沒有任何紀錄資料的話,那就不會有問題;可是如果表格中已經有紀錄了,而且你想要建立一個主索引鍵時,有可能會發生下列的錯誤: [![mysql_09_snap_94](http://box.kancloud.cn/2015-09-15_55f7ea3c14d37.png)](http://box.kancloud.cn/2015-09-15_55f7ea3c14d37.png) 為一個已經存在、而且已經有紀錄的表格建立唯一索引時,也有可能會發生下列的錯誤: [![mysql_09_snap_95](http://box.kancloud.cn/2015-09-15_55f7ea3ca1c31.png)](http://box.kancloud.cn/2015-09-15_55f7ea3ca1c31.png) # 6 索引的名稱 在“CREATE TABLE”或是“ALTER TABLE”敘述中建立索引的話,你可以為建立的索引取一個名稱: [![mysql_09_snap_68](http://box.kancloud.cn/2015-09-15_55f7ea3ce4c97.png)](http://box.kancloud.cn/2015-09-15_55f7ea3ce4c97.png) 如果你在使用上列的語法建立索引的時候沒有指定索引名稱,MySQL會幫你取一個,索引的名稱就是字段名稱,如果是多個字段的索引,就會使用第一個字段當作索引名稱。 使用“CREATE INDEX”建立索引的時候,就一定要指定一個索引名稱: [![mysql_09_snap_69](http://box.kancloud.cn/2015-09-15_55f7ea3da6ea8.png)](http://box.kancloud.cn/2015-09-15_55f7ea3da6ea8.png) 注:在一般的操作中,你并不會用到索引名稱;不過在刪除索引的時候就會用到。 # 7 刪除索引 如果一個已經建立好的索引已經不需要了,為了節省儲存的空間,你可以使用下列的語法刪除索引: [![mysql_09_snap_70](http://box.kancloud.cn/2015-09-15_55f7ea3ddb46f.png)](http://box.kancloud.cn/2015-09-15_55f7ea3ddb46f.png) 下列的敘述使用修改表格“ALTER TABLE”敘述刪除不需要的索引: [![mysql_09_snap_71](http://box.kancloud.cn/2015-09-15_55f7ea3e4a71a.png)](http://box.kancloud.cn/2015-09-15_55f7ea3e4a71a.png) 你也可以使用下列的“DROP INDEX”敘述刪除不需要的索引: [![mysql_09_snap_72](http://box.kancloud.cn/2015-09-15_55f7ea43a7a7e.png)](http://box.kancloud.cn/2015-09-15_55f7ea43a7a7e.png) 使用“ALTER TABLE”敘述可以一次刪除多個索引,“DROP INDEX”敘述一次只能刪除一個索引: [![mysql_09_snap_73](http://box.kancloud.cn/2015-09-15_55f7ea442b13b.png)](http://box.kancloud.cn/2015-09-15_55f7ea442b13b.png) # 8 數值字段型態與AUTO_INCREMENT 在數據庫的應用中,很常會遇到為紀錄“編流水號”的需求,如果資料表中的每一筆紀錄都需要一個遞增的數值編號,你可以選擇整數型態的字段后,再使用“AUTO_INCREMENT”字段屬性: [![mysql_09_snap_74](http://box.kancloud.cn/2015-09-15_55f7ea446528c.png)](http://box.kancloud.cn/2015-09-15_55f7ea446528c.png) 如果一個公司想要儲存員工開會的資料,你可以在建立開會資料表格的時候,為這個表格定義一個儲存開會編號的字段,這個字段需要自動遞增,而且會為它建立主索引鍵: [![mysql_09_snap_75](http://box.kancloud.cn/2015-09-15_55f7ea44e0c67.png)](http://box.kancloud.cn/2015-09-15_55f7ea44e0c67.png) 建立開會資料表格以后,另外建立一個儲存參加會議的員工資料表格: [![mysql_09_snap_76](http://box.kancloud.cn/2015-09-15_55f7ea4a75fcf.png)](http://box.kancloud.cn/2015-09-15_55f7ea4a75fcf.png) 設定為“AUTO_INCREMENT”的整數字段,在新增資料的時候可以不用指定數值,MySQL會為你自動編制一個流水號并儲存在紀錄中;而接著要新增參加這次開會的員工資料到“participate”表格時,你需要用到MySQL剛才會為你在“meeting”表格中自動編制的流水號,這樣的需求可以使用“LAST_INSERT_ID()”函式來取得: [![mysql_09_snap_77](http://box.kancloud.cn/2015-09-15_55f7ea4bd83ed.png)](http://box.kancloud.cn/2015-09-15_55f7ea4bd83ed.png) 新增這些開會與參加會議的員工資料后,就可以使用結合查詢來查詢開會資料了: [![mysql_09_snap_78](http://box.kancloud.cn/2015-09-15_55f7ea4c90188.png)](http://box.kancloud.cn/2015-09-15_55f7ea4c90188.png) 在新增資料時,要讓MySQL為你自動編制一個流水號,并儲存到紀錄中的方式有下列幾種: [![mysql_09_snap_79](http://box.kancloud.cn/2015-09-15_55f7ea4d8ac4e.png)](http://box.kancloud.cn/2015-09-15_55f7ea4d8ac4e.png) MySQL是一個可以讓多人同時使用的數據庫,使用“LAST_INSERT_ID()”函式來取得自動編制的流水號數值,并不會因為不同的用戶端同時使用而造成混亂: [![mysql_09_snap_80](http://box.kancloud.cn/2015-09-15_55f7ea4df3e59.png)](http://box.kancloud.cn/2015-09-15_55f7ea4df3e59.png) “AUTO_INCREMENT”字段的一般用法通常是用來儲存從“1”開始的流水號,每一筆新增的紀錄都會自動加一成為新的編號。可是如果在新增紀錄的時候,自己指定“AUTO_INCREMENT”字段一個數值,就會造成下列的情況: [![mysql_09_snap_81](http://box.kancloud.cn/2015-09-15_55f7ea4e8ba96.png)](http://box.kancloud.cn/2015-09-15_55f7ea4e8ba96.png) “AUTO_INCREMENT”字段在你刪除紀錄以后,也不會幫你重新使用已經用過的編號: [![mysql_09_snap_82](http://box.kancloud.cn/2015-09-15_55f7ea4f1e5fc.png)](http://box.kancloud.cn/2015-09-15_55f7ea4f1e5fc.png) 注:使用“TRUNCATE TABLE”敘述刪除包含“AUTO_INCREMENT”字段表格的所有紀錄,編號會重新從頭開始。 不要指定值,或是指定“NULL”值給“AUTO_INCREMENT”字段,都可以讓MySQL為你自動編制一個流水號,并儲存到紀錄中,這兩種也是比較好的方式;另外指定“AUTO_INCREMENT”字段值為“0”的方式也可以,不過會因為MySQL數據庫服務器的環境設定而有不同的效果: [![mysql_09_snap_83](http://box.kancloud.cn/2015-09-15_55f7ea4fa60c4.png)](http://box.kancloud.cn/2015-09-15_55f7ea4fa60c4.png) 如果你需要編制的流水號范圍是非常大的,你應該選擇“AUTO_INCREMENT”字段的型態為“BIGINT”;MySQL另外提供一個“SERIAL”關鍵字,讓你在定義這種字段時可以比較方便一些: [![mysql_09_snap_84](http://box.kancloud.cn/2015-09-15_55f7ea5023fd5.png)](http://box.kancloud.cn/2015-09-15_55f7ea5023fd5.png) 使用“MyISAM”儲存引擎的表格,可以使用下列這種比較特殊的“AUTO_INCREMENT”字段: [![mysql_09_snap_85](http://box.kancloud.cn/2015-09-15_55f7ea50a0f90.png)](http://box.kancloud.cn/2015-09-15_55f7ea50a0f90.png) 這樣的設定同樣是請MySQL為你自動編制流水號,不過因為“AUTO_INCREMENT”字段包含在主索引鍵中,編制流水號的動作會不太一樣: [![mysql_09_snap_86](http://box.kancloud.cn/2015-09-15_55f7ea560c753.png)](http://box.kancloud.cn/2015-09-15_55f7ea560c753.png) 注:在上列的范例中,是把“empno,location,counter”設定為主索引鍵;如果設定為唯一索引的話,也會有一樣的效果;設定為一般索引的話,會造成錯誤。 使用“AUTO_INCREMENT”字段屬性有下列幾個重點: * 一個表格只能有一個“AUTO_INCREMENT”字段,而且要為它建立一個索引,而且通常是建立主索引鍵或唯一索引,這樣可以防止重復的編號;不過MySQL也允許你建立可重復的索引 * 只有整數型態才可以使用“AUTO_INCREMENT”字段屬性,你可以根據編號大小的需求,選擇使用“TINYINT”、“SMALLINT”、“MEDIUMINT”、“INT”或“BIGINT”,而且因為只會使用到正數,所以你可以加入“UNSIGNED”來增加編號的范圍 * 如果編號已經到字段型態的最大范圍,例如一個“SMALLINT”型態,而且是指定為“UNSIGNED”的“AUTO_INCREMENT”字段,編號已經到“65535”了,如果再執行新增的敘述,就會造成“Duplicate entry ’65535′ for key ‘字段名稱’”的錯誤 # 9 查詢表格與索引資訊 一個數據庫在建立許多表格與索引以后,不論是程式開發或是數據庫管理人員,都會有查詢表格與索引相關資料的需求。例如查詢一個表格中有哪些字段,還有字段的型態與屬性的設定;也可能需要查詢某一個表格建立了哪些索引與設定的資訊。 ## 9.1 表格相關資訊 想要知道一個數據庫中有哪一些表格,可以執行下列的敘述: [![mysql_09_snap_87](http://box.kancloud.cn/2015-09-15_55f7ea56d7854.png)](http://box.kancloud.cn/2015-09-15_55f7ea56d7854.png) 這個敘述可以使用“字串樣式”設定表格名稱的條件: [![mysql_09_snap_88](http://box.kancloud.cn/2015-09-15_55f7ea5c43f56.png)](http://box.kancloud.cn/2015-09-15_55f7ea5c43f56.png) MySQL數據庫在啟動以后,會有一個很特別的數據庫,名稱是“information_schema”,這個數據庫通常會稱為“系統資訊數據庫”。這個數據庫中有一個表格叫作“TABLES”,它儲存所有MySQL數據庫中的表格相關資訊,“TABLES”表格有下列主要的字段: | 字段名稱 | 型態 | 說明 | | --- | --- | --- | | TABLE_SCHEMA | varchar(64) | 數據庫名稱 | | TABLE_NAME | varchar(64) | 表格名稱 | | ENGINE | varchar(64) | 使用的儲存引擎名稱 | | TABLE_ROWS | bigint(21) unsigned | 紀錄數量 | | AUTO_INCREMENT | bigint(21) unsigned | 如果包含“AUTO_INCREMENT”字段的話,這個字段會儲存下一個編號 | | TABLE_COLLATION | varchar(32) | 表格使用的collation | 執行下列的查詢敘述就可以查詢表格詳細的資訊: [![mysql_09_snap_89](http://box.kancloud.cn/2015-09-15_55f7ea5cb0146.png)](http://box.kancloud.cn/2015-09-15_55f7ea5cb0146.png) MySQL也提供下列的敘述讓你查詢一個表格的定義: [![mysql_09_snap_90](http://box.kancloud.cn/2015-09-15_55f7ea5d3e7e3.png)](http://box.kancloud.cn/2015-09-15_55f7ea5d3e7e3.png) 下列的敘述可以查詢建立表格的“CREATE TABLE”敘述: [![mysql_09_snap_91](http://box.kancloud.cn/2015-09-15_55f7ea6290068.png)](http://box.kancloud.cn/2015-09-15_55f7ea6290068.png) 回傳的“Create Table”字段的內容就是一個建立表格的敘述: [![mysql_09_snap_92](http://box.kancloud.cn/2015-09-15_55f7ea63022c4.png)](http://box.kancloud.cn/2015-09-15_55f7ea63022c4.png) ## 9.2 索引相關資訊 MySQL提供“SHOW INDEX”敘述查詢一個表格的索引詳細資訊,下列是執行這個敘述以后,傳回的主要字段資料: | 字段名稱 | 說明 | | --- | --- | | Table | 表格名稱 | | Non_unique | “0”表示不可重復;“1”可以重復 | | Key_name | 索引名稱 | | Seq_in_index | 單一字段的索引為“1”;多個字段的索引表示建立索引的字段順序 | | Column_name | 索引字段名稱 | | Sub_part | 如果是指定長度的索引,這里會顯示長度;不是的話顯示“NULL” | | Null | 是否允許“NULL”值 | | Index_type | 索引種類,“BTREE”或“HASH” | 你可以在“SHOW INDEX FROM”后面指定一個表格名稱,執行以后就可以查詢這個表格所有的索引資訊: [![mysql_09_snap_93](http://box.kancloud.cn/2015-09-15_55f7ea6393f9d.png)](http://box.kancloud.cn/2015-09-15_55f7ea6393f9d.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看