數據定義: CREATE、DROP、ALTER ...
1 CREATE DATABASE 句法 2 3 CREATE DATABASE [IF NOT EXISTS] db_name 4 5 CREATE DATABASE 以給定名字創建一個資料庫。允許的資料庫名規則在章節 6.1.2 資料庫、表、索引、列和別名 中被給出。 如果資料庫已經存在,並且你沒有指定 IF NOT EXISTS,這時會產生一個錯誤。 6 7 在 MySQL 中,資料庫以包含資料庫表對應文件的目錄實現的。因為資料庫在初始創建時沒有表,所以 CREATE DATABASE 語句只在 MySQL 數據目錄下創建一個目錄。 8 9 你也可以使用 mysqladmin 創建一個資料庫。查看章節 4.8 MySQL 客戶端腳本和實用程式。 10 11 6.5.2 DROP DATABASE 句法 12 13 DROP DATABASE [IF EXISTS] db_name 14 15 DROP DATABASE 移除資料庫是的所有表並刪除資料庫。如果你在一個符號鏈接(symbolic link)資料庫上執行一個 DROP DATABASE,鏈接與原始資料庫均會被刪除。要非常小心地使用這個命令! 16 17 DROP DATABASE 返回從資料庫目錄下刪除的文件數目。通常,它是表的數目的三倍,因為第張表通常對應於一個 “.MYD” 文件、一個 “.MYI” 文件和一個 “.frm” 文件。 18 19 DROP DATABASE 命令從給定的資料庫目錄下移除以下列為擴展名的所有文件: 20 21 擴展名 擴展名 擴展名 Ext 22 .BAK .DAT .HSH .ISD 23 .ISM .ISM .MRG .MYD 24 .MYI .db .frm 25 26 所有包含兩個數字的子目錄(RAID 目錄)也同樣被刪除。 27 28 在 MySQL 3.22 或以後的版本中,你可以使用關鍵詞 IF EXISTS 以防止如果資料庫不存在時發生錯誤。 29 30 你也可以使用 mysqladmin 移除資料庫。查看章節 4.8 MySQL 客戶端腳本和實用程式。 31 32 6.5.3 CREATE TABLE 句法 33 34 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] 35 [table_options] [select_statement] 36 37 or 38 39 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name LIKE old_table_name; 40 41 create_definition: 42 col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] 43 [PRIMARY KEY] [reference_definition] 44 or PRIMARY KEY (index_col_name,...) 45 or KEY [index_name] (index_col_name,...) 46 or INDEX [index_name] (index_col_name,...) 47 or UNIQUE [INDEX] [index_name] (index_col_name,...) 48 or FULLTEXT [INDEX] [index_name] (index_col_name,...) 49 or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...) 50 [reference_definition] 51 or CHECK (expr) 52 53 type: 54 TINYINT[(length)] [UNSIGNED] [ZEROFILL] 55 or SMALLINT[(length)] [UNSIGNED] [ZEROFILL] 56 or MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL] 57 or INT[(length)] [UNSIGNED] [ZEROFILL] 58 or INTEGER[(length)] [UNSIGNED] [ZEROFILL] 59 or BIGINT[(length)] [UNSIGNED] [ZEROFILL] 60 or REAL[(length,decimals)] [UNSIGNED] [ZEROFILL] 61 or DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL] 62 or FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL] 63 or DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL] 64 or NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL] 65 or CHAR(length) [BINARY] 66 or VARCHAR(length) [BINARY] 67 or DATE 68 or TIME 69 or TIMESTAMP 70 or DATETIME 71 or TINYBLOB 72 or BLOB 73 or MEDIUMBLOB 74 or LONGBLOB 75 or TINYTEXT 76 or TEXT 77 or MEDIUMTEXT 78 or LONGTEXT 79 or ENUM(value1,value2,value3,...) 80 or SET(value1,value2,value3,...) 81 82 index_col_name: 83 col_name [(length)] 84 85 reference_definition: 86 REFERENCES tbl_name [(index_col_name,...)] 87 [MATCH FULL | MATCH PARTIAL] 88 [ON DELETE reference_option] 89 [ON UPDATE reference_option] 90 91 reference_option: 92 RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT 93 94 table_options: 95 TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MRG_MYISAM | MYISAM } 96 or AUTO_INCREMENT = # 97 or AVG_ROW_LENGTH = # 98 or CHECKSUM = {0 | 1} 99 or COMMENT = "string" 100 or MAX_ROWS = # 101 or MIN_ROWS = # 102 or PACK_KEYS = {0 | 1 | DEFAULT} 103 or PASSWORD = "string" 104 or DELAY_KEY_WRITE = {0 | 1} 105 or ROW_FORMAT= { default | dynamic | fixed | compressed } 106 or RAID_TYPE= {1 | STRIPED | RAID0 } RAID_CHUNKS=# RAID_CHUNKSIZE=# 107 or UNION = (table_name,[table_name...]) 108 or INSERT_METHOD= {NO | FIRST | LAST } 109 or DATA DIRECTORY="absolute path to directory" 110 or INDEX DIRECTORY="absolute path to directory" 111 112 select_statement: 113 [IGNORE | REPLACE] SELECT ... (Some legal select statement) 114 115 CREATE TABLE 以給定的名字在當前資料庫創建一個表。允許的表名規則在章節 6.1.2 資料庫、表、索引、列和別名 中被給出。如果沒有當前資料庫或表已經存在,一個錯誤將會發生。 116 117 在 MySQL 3.22 或以後的版本中,表名可以被指定為 db_name.tbl_name。不管有沒有當前資料庫,它也能正常工作。 118 119 從 MySQL 3.23 開始,在創建一個表時,你可以使用關鍵詞 TEMPORARY。它的名字被限止在當前連接中,當連接關閉時,臨時表會自動地被刪除。這就意味著,兩個不同的連接可以使用同一個臨時表名而不會與另一個衝突,也不會與同名現有的表相衝突(現有表將被隱藏,只到臨時表被刪除)。從 MySQL 4.0.2 開始,為了能創建臨時表,你必須有 CREATE TEMPORARY TABLES 許可權。 120 121 在 MySQL 3.23 或以後的版本中,你可以使用關鍵詞 IF NOT EXISTS,因而如果表已存在,錯誤也不會發生。註意,它並不驗證表結構是否一致。 122 123 在 MySQL 4.1 中你可以使用 LIKE 來基於一個表定義創建另一個表。to create a table based on a table definition in another table. In MySQL 4.1 中,你同樣也可以為一個被生成的列指定類型: 124 125 CREATE TABLE foo (a tinyint not null) SELECT b+1 AS 'a' FROM bar; 126 127 第張表 tbl_name 由資料庫目錄下的一些文件表示。對於 MyISAM 類型的表,你將得到: 128 129 文件 用途 130 tbl_name.frm 表定義 (form) 文件 131 tbl_name.MYD 數據文件 132 tbl_name.MYI 索引文件 133 134 對於各種列類型的性質的更多信息,查看章節 6.2 列類型: 135 136 如果既沒有指定 NULL 也沒有指定 NOT NULL,列被視為指定了 NULL 。 137 138 一個整型列可以有附加屬性 AUTO_INCREMENT。當你插入一個 NULL 值(推薦)或 0 到一個 AUTO_INCREMENT 列,該列將被設置到 value+1,在這裡,value 是表中當前列的最大值。AUTO_INCREMENT 序列以 1 開始。查看章節 8.1.3.130 mysql_insert_id()。 如果你一個 AUTO_INCREMENT 列中包含最大值的行,對於 ISAM 或 BDB 表,該值會被重新使用,但是對於一個 MyISAM 或 InnoDB 表,卻不會被重用。如果你以 AUTOCOMMIT 模式執行 DELETE FROM table_name (沒有一個 WHERE 子句) 刪除表中的所有記錄行,對於所有的表序列均重新開始。 註意:每個表只能有一個 AUTO_INCREMENT 列,並且必須被索引。MySQL 3.23 同樣也只工作於 AUTO_INCREMENT 列只支持正值。插入一個負值將被當作插入一個很大的正值。這是為了避免數字從正到負“包裝”的精度問題,也是為了確保不會意外地得到一個包含 0 的 AUTO_INCREMENT 列。 在 MyISAM 和 BDB 表中,你可以指定 AUTO_INCREMENT 多列索引中的第二個列。查看章節 3.5.9 使用 AUTO_INCREMENT. 為了使 MySQL 相容某些 ODBC 應用程式,你可以用下列查詢找出最後被插入的記錄行: 139 SELECT * FROM tbl_name WHERE auto_col IS NULL 140 141 如果 MySQL 二進位日誌被使用,CREATE TABLE 將自動地提交當前 InnoDB 事務。 142 143 NULL 值對於 TIMESTAMP 列的處理不同於其它的列類型。你不能在一個 TIMESTAMP 列中 存儲一個文字 NULL;將列設置為 NULL 將設置它為當前的日期和時間。因為 TIMESTAMP 列的行為就是這樣,列的 NULL 和 NOT NULL 屬性不以常態方式影響它,如果你指定它們,將被忽略。 另一方面,為了使 MySQL 客戶端更容易地使用 TIMESTAMP 列,伺服器報告這樣的列被賦值為 NULL 值(這是真的),即使 TIMESTAMP 實際上決不會包含一個 NULL 值。當你使用 DESCRIBE tbl_name 得到有關你的表的描述時,你就會明白這點。 註意,設置一個 TIMESTAMP 列為 0 不等同於設置它為 NULL,因為 0 是一個有效的 TIMESTAMP 值。 144 145 DEFAULT 值必須是一個常量,不可以是一個函數或一個表達式。 如果一個列沒有指定 DEFAULT 值,MySQL 將自動地賦於一個,規則如下: 如果列可以接受 NULL 作為一個值,預設值為 NULL。 如果列被定義為 NOT NULL,預設值取決於列的類型: 146 對於沒有聲明 AUTO_INCREMENT 屬性的數字類型,預設值為 0。對於一個 AUTO_INCREMENT 列,預設值為序列中的下一個值。 147 148 對於非 TIMESTAMP 的日期和時間類型,預設值是該類型適當的零值。對於表中的第一個 TIMESTAMP 列,預設值為當前的日期和時間。查看章節 6.2.2 Date 和 Time 類型。 149 150 對於非 ENUM 的字元串類型,預設值是空字元串。對於 ENUM,預設值為第一個枚舉值。 151 152 預設值必須是常量。這意味著,例如,對於一個日期列,你不能將一個像 NOW() 或 CURRENT_DATE 的函數設置為預設值。 153 154 KEY 是 INDEX 的同義詞。 155 156 在 MySQL 中,一個 UNIQUE 鍵只能有不同的值。如果你試圖以匹配一個現有行的鍵添加新行,將產生一個錯誤。 157 158 PRIMARY KEY 是一個唯一 KEY,它還有一個額外的約束,所有鍵列必須被定義為 NOT NULL。在 MySQL 中,該被命名為 PRIMARY。一張表只能有一個 PRIMARY KEY。如果在你的表中沒有一個 PRIMARY KEY,而某些應用程式要求 PRIMARY KEY,MySQL 將返回第一個沒有任何 NULL 列的 UNIQUE 鍵,做為 PRIMARY KEY。 159 160 一個 PRIMARY KEY 可以是一個多列索引。然而,你不能在一個列規格說明中使用 PRIMARY KEY 鍵屬性來創建一個多列索引。這樣做將僅僅標記單個列做為主鍵。你必須使用 PRIMARY KEY(index_col_name, ...) 句法。 161 162 如果 PRIMARY 或 UNIQUE 鍵只由一個列組成,並且列類型是整型,你可以用 _rowid 引用它。(在版本 3.23.11 中新加入)。 163 164 如果你不為一個索引指派一個名字,索引名將被指派為與第一個 index_col_name 相同的名字,以一個可選尾碼 (_2,_3, ...) 使它唯一。使用 SHOW INDEX FROM tbl_name 可以從一個表中查看索引名。查看章節 4.5.6.1 檢索有關資料庫、表、列和索引的信息。 165 166 只有 MyISAM、InnoDB 和 BDB 表類型支持在可以有 NULL 值的列上索引。在其它情況下,你必須聲明這個列為 NOT NULL 或者得到一個錯誤結果。 167 168 使用 col_name(length) 句法,你可以一個索引只使用一個 CHAR 或 VARCHAR 列的一部分。這可以使索引文件更小一點。查看章節 5.4.4 列索引。 169 170 只有 MyISAM 表類型運動在 BLOB 和 TEXT 列上索引。當在一個 BLOB 或 TEXT 列上放置一個索引時,你必須總是指定索引的長度: 171 CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10))); 172 173 當你對一個 TEXT 或 BLOB 列使用 ORDER BY 或 GROUP BY 時,只有最前面 的 max_sort_length 位元組被使用。查看章節 6.2.3.2 BLOB 和 TEXT 類型。 174 175 在 MySQL 3.23.23 或更新的版本中,你也可以創建特殊的 FULLTEXT 索引。他們被用於全文搜索。只有 MyISAM 表類型支持 FULLTEXT 索引。他只能從 CHAR、VARCHAR 和 TEXT 列建立。索引總是建立在整個列上;部分索引是不支持的。詳細操作請查看章節 6.8 MySQL 全文搜索。 176 177 在 MySQL 3.23.44 或更新的版本中,InnoDB 表支持外鍵約束檢查。查看章節 7.5 InnoDB 表。註意,InnoDB 中的 FOREIGN KEY 句法比上面介紹的句法有更多的限制。InnoDB 不允許 index_name 被指定,參考表的列總是必須明確命名。從 4.0.8 開始,InnoDB 在外鍵上支持 ON DELETE 和 ON UPDATE 動作。精確句法查看 InnoDB 手冊章節。查看章節 7.5 InnoDB 表。對於其它的表類型,MySQL 伺服器對 CREATE TABLE 命令中的 FOREIGN KEY、CHECK 和 REFERENCES 句法作語法分析,但是沒有更進一步的行為。查看章節 1.8.4.5 外鍵。 178 179 每個 NULL 列占據額外的一個比特,取捨到最接近的位元組。 180 181 最大記錄的位元組長度可以按下麵的計算得出: 182 row length = 1 183 + (sum of column lengths) 184 + (number of NULL columns + 7)/8 185 + (number of variable-length columns) 186 187 table_options 和 SELECT 選項只在 MySQL 3.23 和以後的版本中被實現。 不同的表類型為: 188 189 表類型 含義 190 BDB 或 BerkeleyDB 以頁鎖定的事務安全型表。查看章節 7.6 BDB 或 BerkeleyDB 表 191 HEAP 這個表的數據只存放在記憶體中。查看章節 7.4 HEAP 表 192 ISAM 最初的存儲引擎。查看章節 7.3 ISAM 表 193 InnoDB 以行鎖定的事務安全型表。查看章節 7.5 InnoDB 表 194 MERGE 做為一個表使用的 MyISAM 表的收集品。查看章節 7.2 MERGE 表 195 MRG_MyISAM MERGE 表的別名 196 MyISAM 用於代替 ISAM 的新的輕便型二進位存儲引擎。查看章節 7.1 MyISAM 表 197 198 199 查看章節 7 MySQL 表類型。 如果一個表類型被指定,而那個特殊類型是不可用的,MySQL 將選擇最接近於你所指定類型的表類型。例如,如果 TYPE=BDB 被指定,而當前版本的 MySQL 不支持 BDB 表,該將會做為 MyISAM 表代替被創建。 其它的表選項是用於優化表行為的。在大多數情況下,你不必指定他們中的任何一個。選項對所有表均適用,如果不適用則另外說明: 200 201 選項 含義 202 AUTO_INCREMENT 你想要為你的表設定的下一個 AUTO_INCREMENT 值。(MyISAM) 203 AVG_ROW_LENGTH 你的表的平均行長度的近似值。你只需為有變長記錄的大表設置它 204 CHECKSUM 如果你希望 MySQL 對所有的記錄行維持一個檢驗和(這將使表在更新時變得更慢,但是使得更容易地發現損壞的表),設置它為 1。(MyISAM) 205 COMMENT 對於你的表的一個 60 個字元的註釋 206 MAX_ROWS 你計劃在表中存儲的最大記錄行數目 207 MIN_ROWS 你計劃在表中存儲的最小記錄行數目 208 PACK_KEYS 如果你希望有更小的索引,設置它為 1。這通常使的更新更加得慢,面讀取列快 (MyISAM, ISAM)。設置它為 0,將禁用所有鍵壓縮。設置它為 DEFAULT (MySQL 4.0),將告訴存儲引擎僅僅壓縮長的 CHAR/VARCHAR 列 209 PASSWORD 以一個密碼加密 `.frm' 文件。在 MySQL 標準版中,這個選項不做任何事 210 DELAY_KEY_WRITE 如果希望延遲鍵表更新,直到該表被關閉,設置它為 1。(MyISAM). 211 ROW_FORMAT 定義記錄行如何被存儲。目前,這個選項只能工作於 MyISAM 表,它支持 DYNAMIC 和 FIXED 行格式。查看章節 7.1.2 MyISAM 表格式 212 213 214 當你使用一個 MyISAM 表時,MySQL 使用 max_rows * avg_row_length 的乘積來最終表將有多大。如果你不指定上面的任何選項,一個表的最大民族教育將是 4G (或 2G ,如果你的操作系統僅支持 2G 的最大文件)。原因是僅僅是為了控制指針範圍使索引更小和更快,如果您真的不需要大文件。 如果你不使用 PACK_KEYS,預設僅僅壓縮字元串,不壓縮數字。如果你使用 PACK_KEYS=1,數字也將被很好地壓縮。 當壓縮二進位數字鍵時,MySQL 將使用 prefix 壓縮。這就意味著,如果有許多同樣的數字,你才能得到很大的益處。Prefix 壓縮意味著每個鍵都需要一個額外的位元組來指示前一個鍵有多少位元組與下一個鍵相同(註意,行指針被以高元組第一次序(high-byte-first-order)直接地存儲在鍵後,以改善壓縮)。這就意味著,如果在一個記錄行上有連續兩行的相等鍵,下麵所有“相同”的鍵通常只占用 2 個位元組(包括記錄行指針)。與通常情況下相比,下麵的“相同”鍵將占用 storage_size_for_key + pointer_size (通常 4) 個位元組。另一方面,如果所有的鍵都是不同的,你將在每個鍵上損失 1 位元組,如果該鍵不是一個可以有 NULL 值的鍵。(在這種情況下,壓縮後鍵的長度將存儲在用於鍵是否為 NULL 的位元組中。) 215 216 如果你在一個 CREATE 語句中指定一個 SELECT,MySQL 為 SELECT 中的所有元素創建新的欄位。例如: 217 mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT, 218 -> PRIMARY KEY (a), KEY(b)) 219 -> TYPE=MyISAM SELECT b,c FROM test2; 220 221 這將創建一個有三個列的 MyISAM 表,a、b 和 c 。請註意,SELECT 語句中的列被添加到表的右邊,而不是重疊在上面。看下麵的例子: 222 mysql> SELECT * FROM foo; 223 +---+ 224 | n | 225 +---+ 226 | 1 | 227 +---+ 228 229 mysql> CREATE TABLE bar (m INT) SELECT n FROM foo; 230 Query OK, 1 row affected (0.02 sec) 231 Records: 1 Duplicates: 0 Warnings: 0 232 233 mysql> SELECT * FROM bar; 234 +------+---+ 235 | m | n | 236 +------+---+ 237 | NULL | 1 | 238 +------+---+ 239 1 row in set (0.00 sec) 240 241 對於表 foo 中每個記錄行,一個以從表 foo 來的值和新列的預設值組成的記錄行被插入到表 bar 中。 CREATE TABLE ... SELECT 不會為了自動地創建索引。這是故意這樣做的,是為了該命令儘可能地靈活。如果你希望在創建表時同時創建索引,你必須在 SELECT 語句之前指定它們: 242 mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo; 243 244 如果在拷貝數據到表中時發生任何錯誤,數據將被自動地刪除。 為了確保更新日誌/二進位日誌可用於重建最初的表,在 CREATE TABLE ... SELECT 過程中,MySQL 不允許併發的插入。 245 246 在不支持大文件的操作系統上,RAID_TYPE 選項可以幫助你打破 MyISAM 數據文件(非索引文件)的 2G/4G 限止。註意,這個選項在支持大文件的文件系統上不推薦使用! 將 RAID 目錄放在不同的物理磁碟上,可以通過 I/O 瓶頸得到更高的速度。RAID_TYPE 可以在任何操作系統上工作,只要你配置 MySQL --with-raid。目前 RAID_TYPE 只允許 STRIPED (1 和 RAID0 是它的別名)。 如果你對一個 MyISAM 表指定 RAID_TYPE=STRIPED ,MyISAM 將在資料庫目錄下創建 RAID_CHUNKS 子目錄,並命名為 00, 01, 02 。在每個目錄中,MyISAM 將創建一個 table_name.MYD。當將數據寫入數據文件中時,RAID 處理器將映射第一個 RAID_CHUNKSIZE *1024 位元組到第一個文件中,下一個 RAID_CHUNKSIZE *1024 位元組到下一個文件中,等等。 247 248 UNION 被用於當你希望將多個同樣的表收集為一個時。它僅僅與 MERGE 表一起配合使用。查看章節 7.2 MERGE 表。 目前,在你將幾個表映射為一個 MERGE 表時,你需要有對這些表的 SELECT、UPDATE 和 DELETE 許可權。所有被映射的表必須與 MERGE 表在同一個資料庫中。 249 250 如果你希望向一個 MERGE 表中插入數據,你不得不用 INSERT_METHOD 指定記錄行插入到哪一個表中。查看章節 7.2 MERGE 表。這個選項在 MySQL 4.0.0 中被引入。 251 252 在創建表時,PRIMARY 鍵必須放在第一位,然後是所有 UNIQUE 鍵,再後是普通鍵。這可以幫助 MySQL 優化程式區分哪個鍵優先使用,同時更快地檢測出重覆的 UNIQUE 鍵。 253 254 通過使用 DATA DIRECTORY="directory" 或 INDEX DIRECTORY="directory",你可以指定存儲引擎在什麼地方存放它的表和索引文件。註意,目錄必須以一個完整路徑指定(不是相對路徑)。 這僅僅工作於 MySQL 4.0 中的 MyISAM 表,並且你沒有使用 --skip-symlink 選項。查看章節 5.6.1.2 對錶使用符號鏈接。 255 6.5.3.1 隱式的列定義變化 256 257 在某些情況下,MySQL 隱式地改變一個在 CREATE TABLE 給定的列的規約。(這在 ALTER TABLE 中也可能發生。): 258 259 長度不超過四個位元組的 VARCHAR 列被改變為 CHAR。 260 261 如果在一個表中有任何一個列是變長的,則結果是整個記錄行也是變長的。因此,如果一個表中包含任何變長的列(VARCHAR、TEXT 或 BLOB),所有長於 3 個字元的 CHAR 列將被改變為 VARCHAR 列。這在任何方面都不影響你如何使用該列;在 MySQL 中,VARCHAR 只是存儲字元的另一個不同的方法。MySQL 執行這個轉換,是因為它節省空間,並且使表操作更快。查看章節 7 MySQL 表類型。 262 263 TIMESTAMP 的顯示尺寸必須是在 2 到 14 範圍之內的偶數。如果指定顯示尺寸為 0 或超過 14,尺寸被強制設為 14。從 1 到 13 範圍內的奇數值尺寸將被強製為下一個更大的偶數。 264 265 你不能在一個 TIMESTAMP 列中存儲一個文字 NULL;將一個 NULL 值賦給它將設置它為當前的日期和時間。因為 TIMESTAMP 列的行為就是這樣,列的 NULL 和 NOT NULL 屬性不以常態方式影響它,如果你指定它,將被忽略。DESCRIBE tbl_name 總是報告一個 TIMESTAMP 列被賦於了 NULL 值。 266 267 MySQL 將其它 SQL 資料庫供應商使用的列類型映射到 MySQL 類型。查看章節 6.2.5 使用來自其它的資料庫引擎的列類型。 268 如果你希望知道在你創建或改變了你的表後, MySQL 是否使用了不同於你所指定的列類型,你可以發出一個 DESCRIBE tbl_name 語句。 269 270 如果你使用 myisampack 壓縮一個表,其它的某些列類型可能會發生改變。查看章節 7.1.2.3 壓縮表的特征。 271 272 6.5.4 ALTER TABLE 句法 273 274 ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec ...] 275 276 alter_specification: 277 ADD [COLUMN] create_definition [FIRST | AFTER column_name ] 278 or ADD [COLUMN] (create_definition, create_definition,...) 279 or ADD INDEX [index_name] (index_col_name,...) 280 or ADD PRIMARY KEY (index_col_name,...) 281 or ADD UNIQUE [index_name] (index_col_name,...) 282 or ADD FULLTEXT [index_name] (index_col_name,...) 283 or ADD [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...) 284 [reference_definition] 285 or ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT} 286 or CHANGE [COLUMN] old_col_name create_definition 287 [FIRST | AFTER column_name] 288 or MODIFY [COLUMN] create_definition [FIRST | AFTER column_name] 289 or DROP [COLUMN] col_name 290 or DROP PRIMARY KEY 291 or DROP INDEX index_name 292 or DISABLE KEYS 293 or ENABLE KEYS 294 or RENAME [TO] new_tbl_name 295 or ORDER BY col 296 or table_options 297 298 ALTER TABLE 允許你改變一個現有表的結構。例如,你可以添加或刪除列,創建或撤銷索引,更改現有列的類型或將列或表自身更名。你也可以改變表的註釋和表的類型。查看章節 6.5.3 CREATE TABLE 句法。 299 300 如果你使用 ALTER TABLE 來改變一個列規約,但是 DESCRIBE tbl_name 顯示你的列並沒有被修改,這有可能是因為章節 6.5.3.1 隱式的列定義變化 描述的一個原因,使 MySQL 忽略了你的修改。例如,如果你嘗