2. create tablemysql
語法:sql
CREATE TABLE建立一個具備給定名稱的表。你必須具備表的CREATE權限。數據庫
默認狀況下,CREATE TABLE會在默認數據庫建立表,且使用的是InnoDB存儲引擎。若是表已經存在,或者沒有默認數據庫,或者指定的數據庫不存在,則返回錯誤。express
MySQL會存儲表建立時原始的CREATE TABLE語句,包括全部說明和表選項。服務器
本節將討論CREATE TABLE的如下幾個方面:函數
表名佈局
臨時表性能
複製表優化
列數據類型及屬性spa
索引和外鍵
表選項
建立分區表
表名
tbl_name
能夠將表名稱指定爲db_name.tbl_name以期在特定數據庫中建立表。只要目標數據庫存在,那麼不管是否指定了默認數據庫,這種方法都有效。若是你在名字裏面使用了引用標識符,那麼就須要分別引用數據庫名和表名。例如,`mydb`.`mytbl`,而不能是`mydb.mytbl`
IF NOT EXISTS
若是表已經存在,則防止發生錯誤。注意,MySQL並不會驗證現有表結構與CREATE TABLE語句指定的表結構是否相同。
臨時表
建立表時可使用關鍵字TEMPORARY。臨時表僅在當前會話中可見,並在會話關閉時自動刪除。
複製表
LIKE
可使用CREATE TABLE ... LIKE語句根據另外一個表的定義建立一個空表,該空表將包含原表全部的列屬性和索引:
[AS] query_expression
要從另外一個表中建立一個新表,能夠在CREATE TABLE語句的末尾添加一個SELECT語句:
IGNORE | REPLACE
當使用SELECT語句複製表時,IGNORE和REPLACE選項用於指示如何處理致使惟一鍵產生重複的行。
列數據類型及屬性
理論上每一個表的列數的上限是4096,可是對於一個給定的表來講,有效的最大值可能比該值要小。
data_type
data_type表示列定義中的數據類型,spatial_type表示空間數據類型。
某些屬性不適用於全部數據類型。AUTO_INCREMENT只適用於整數和浮點數類型。DEFAULT不適用於TEXT或BLOB類型;
字符數據類型(CHAR, VARCHAR, TEXT)能夠包含CHARACTER SET和COLLATE屬性以指定列的字符集和排序規則。其中,CHARSET等同於CHARACTER SET。例如:
MySQL5.5將字符列定義中的長度說明解釋爲字符數;將二進制字符列(BINARY和VARBINARY)定義中的長度說明解釋爲字節數
對於CHAR, VARCHAR, BINARY和VARBINARY列,能夠建立僅使用列值前綴的索引,可使用col_name(length)語法指定索引前綴的長度。TEXT和BLOB列也能夠被索引,但必須指定前綴長度。對於非二進制字符串類型,前綴長度是字符數;對於二進制字符串類型,前綴長度是字節數。也就是說,對於CHAR, VARCHAR和TEXT列,索引項由列值的前length個字符組成;對於BINARY, VARBINARY和BLOB列,索引項由列值的前length個字節組成。前綴索引可使索引文件更小。
只有InnoDB和MyISAM存儲引擎支持對TEXT和BLOB列進行索引。例如:
NOT NULL | NULL
一個列若是既沒有指定NULL,也沒有指定NOT NULL,則等同於指定了NULL。
在MySQL 5.5中,只有InnoDB,MyISAM和MEMORY存儲引擎支持索引可爲NULL的列。其它狀況下,你必須將索引列聲明爲NOT NULL,不然會出錯
DEFAULT
指定列的默認值。默認值必須是常量,不能是函數或表達式。這意味着,你不能將一個DATE列的默認值設置爲諸如NOW()或CURRENT_DATE之類的函數的值。例外是能夠將CURRENT_TIMESTAMP指定爲TIMESTAMP列的默認值。
若是列定義沒有顯式的DEFAULT值,則MySQL將按照第11.6節「數據類型默認值」中所描述的來肯定默認值。
TEXT和BLOB列不能指定默認值
若是日期的默認值不符合NO_ZERO_IN_DATE SQL模式,則CREATE TABLE將失敗,即便並無啓用嚴格的SQL模式。例如,c1 DATE DEFAULT '2010-00-00' 將致使CREATE TABLE失敗,錯誤信息爲:Invalid default value for 'c1'
AUTO_INCREMENT
整數或浮點數列能夠具備額外的屬性AUTO_INCREMENT。當你將NULL或0插入被索引的AUTO_INCREMENT列時,該列將被設置爲下一個序列值,一般爲value + 1,其中value是表中當前列的最大值。AUTO_INCREMENT序列從1開始。
要想在插入一行以後檢索AUTO_INCREMENT的值,請使用SQL函數LAST_INSERT_ID()或C API函數mysql_insert_id()
若是啓用了NO_AUTO_VALUE_ON_ZERO SQL模式,你能夠在AUTO_INCREMENT列中存儲0,而不生成新的序列值。
每一個表只能有一個AUTO_INCREMENT列,它必須被索引,並且不能有DEFAULT值。只有當AUTO_INCREMENT列僅包含正值時,它才能夠正常工做。插入一個負數被認爲是插入一個很是大的正數。這樣作是爲了不數值「從正到負」產生的精度問題,並確保不會意外地獲得一個包含0的AUTO_INCREMENT列。
對於MyISAM表,能夠在多列索引(組合索引)中指定一個AUTO_INCREMENT輔助列。
爲使MySQL與某些ODBC應用程序兼容,你可使用以下查詢獲取最後插入行的AUTO_INCREMENT值:
此方法要求sql_auto_is_null變量不爲0
COMMENT
可使用COMMENT選項指定列的註釋,註釋最多包含1024個字符(MySQL 5.5.3以前是255個字符)。註釋由SHOW CREATE TABLE和SHOW FULL COLUMNS語句中顯示。
COLUMN_FORMAT
COLUMN_FORMAT用於指定NDB表中列的數據存儲格式,它對其它存儲引擎表中的列無影響。在MySQL 5.5及更高版本中,COLUMN_FORMAT被忽略。
STORAGE
對於NDB表,能夠經過使用STORAGE子句來指定列是存儲在磁盤上仍是內存中。STORAGE子句對使用NDB之外的存儲引擎的表沒有影響。STORAGE關鍵字僅在與NDB Cluster一塊兒提供的mysqld的構建中受支持;在其它任何版本的MySQL中都不識別,這種狀況下使用STORAGE關鍵字會致使語法錯誤
索引和外鍵
CONSTRAINT symbol
若是給定了CONSTRAINT symbol子句,則symbol值在數據庫中必須惟一。重複的symbol會致使錯誤。若是沒有給出子句,或者在CONSTRAINT關鍵字以後不包含symbol,則會自動建立約束的名稱。
PRIMARY KEY
惟一索引且所有索引列必須爲NOT NULL,即惟一非空索引。若是列沒有被顯式地聲明爲NOT NULL,那麼MySQL會隱式地將其聲明爲NOT NULL。表只能有一個PRIMARY KEY。PRIMARY KEY的名稱老是PRIMARY,所以不能將其被用做任何其它類型索引的名稱。
若是你沒有定義PRIMARY KEY,而且應用程序須要表中的PRIMARY KEY,MySQL將返回第一個全部列非空的惟一索引做爲PRIMARY KEY。
在InnoDB表中,請保持PRIMARY KEY簡短,以下降輔助索引的存儲開銷。每一個輔助索引條目包含對應行的主鍵列的副本。
在建立的表中,PRIMARY KEY被放在最前面,後跟所有的UNIQUE索引,最後是非惟一索引。這種排列結構有助於MySQL優化器決定優先使用哪一個索引,也有助於更快地檢測到重複的UNIQUE鍵。
PRIMARY KEY能夠是多列索引(組合索引)。可是,你不能在列說明中使用PRIMARY KEY鍵屬性建立一個多列索引。這樣作只會將單個列標記爲primary。你必須使用單獨的PRIMARY KEY(index_col_name, ...)子句。
若是PRIMARY KEY只包含一個整數列,你能夠在SELECT語句中使用_rowid引用該列。
在MySQL中,PRIMARY KEY的名稱是PRIMARY。對於其它索引,若是沒有指定名稱,MySQL將爲其分配一個與第一個索引列同名的名稱,並加上可選的後綴(_2, _3, ...)使其惟一。你可使用SHOW INDEX FROM tbl_name查看錶的索引名稱。
KEY | INDEX
KEY一般是INDEX的同義詞。在列定義中,鍵屬性PRIMARY KEY也能夠指定爲KEY。這是爲了與其它數據庫系統兼容而實現的。
UNIQUE
惟一索引建立了一個約束,它要求索引中的全部值必須是不一樣的。若是嘗試添加與現有行的鍵值匹配的新行,就會出現錯誤。對於全部的存儲引擎,惟一索引容許可爲NULL的索引列同時包含多個NULL值。
若是惟一索引只包含一個整數列,那麼你能夠在SELECT語句中使用_rowid引用該列。
FULLTEXT
全文索引是一種用於全文搜索的特殊類型的索引。只有MyISAM存儲引擎支持全文索引。它們只能由CHAR, VARCHAR和TEXT列建立。並且必須索引整個列,而不能僅使用列前綴,任何指定的前綴長度都將被忽略。若是全文索引和搜索操做須要特殊的處理,則能夠經過index_option中的WITH PARSER子句將解析器插件與索引相關聯。
SPATIAL
你能夠在空間數據類型上建立空間索引。只有MyISAM表支持空間類型,且索引列必須聲明爲NOT NULL。
FOREIGN KEY
MySQL支持外鍵,它容許跨表交叉引用相關數據;以及外鍵約束,它有助於保持這種擴展數據的一致性。
採用InnoDB存儲引擎的分區表不支持外鍵。
CHECK
CHECK子句被解析,但被全部存儲引擎忽略
index_col_name
index_col_name說明能夠以ASC或DESC結尾。這些關鍵字主要用於未來的擴展,用以指定索引值正序或降序存儲。目前,它們被解析但被忽略。索引值始終以升序存儲。
對於InnoDB表,經過length屬性指定的前綴最長767字節,若是開啓了innodb_large_prefix則能夠擴展到3072字節。
前綴限制以字節爲單位。在CREATE TABLE, ALTER TABLE和CREATE INDEX語句中,爲非二進制字符串類型(CHAR, VARCHAR, TEXT)指定的前綴長度被解釋爲字符數;爲二進制字符串類型(BINARY, VARBINARY, BLOB)指定的前綴長度被解釋爲字節數。在爲使用多字節字符集的非二進制字符串列指定前綴長度時,請注意這一點。
index_type
某些存儲引擎容許你在建立索引時指定索引類型。index_type說明符的語法是USING type_name。
例如:
USING的首選位置是在索引列列表以後。它能夠在列列表以前給出,但支持在該位置上使用該選項已經被棄用,並將在之後的MySQL版本中刪除。
index_option
index_option值指定索引的其它選項
KEY_BLOCK_SIZE
對於MyISAM表,KEY_BLOCK_SIZE用於指定索引鍵塊的大小,以字節爲單位。該值僅爲提示,若是有必要,一個不一樣的大小將被使用。爲單個索引定義指定的KEY_BLOCK_SIZE值將覆蓋表級別的KEY_BLOCK_SIZE值。
with parser
若是全文索引和搜索操做須要特殊的處理,則能夠在index_option中使用with parser子句將解析器插件與索引相關聯。此子句僅對FULLTEXT索引有效。
comment
從MySQL 5.5.3開始,索引定義能夠包含最多1024個字符的可選註釋
reference_definition
InnoDB表支持外鍵約束檢查。被引用表的列必須被明確地命名。外鍵上既有on delete也有on update操做。
對於其它存儲引擎,MySQL服務器解析並忽略create table語句中的foreign key和references語法。
重要
對於熟悉ANSI/IOS SQL標準的用戶,請注意,包括InnoDB在內沒有任何存儲引擎識別或執行引用完整性約束定義中的match子句。顯式地使用match子句不會產生指定的效果,還會致使on delete和on update子句被忽略。出於這些緣由,咱們應該避免指定match。
在SQL標準中,match子句控制複合(多列)外鍵中的NULL值在與主鍵進行比較時如何處理。InnoDB實際上實現了match simple中定義的語義,它容許外鍵部分或所有爲NULL。在這種狀況下,包含這樣外鍵的行能夠插入到子表中,但不匹配被引用表(父表)中的任何行。可使用觸發器實現其它語義。
此外,MySQL要求被引用的列必須被索引,以提升性能。然而,InnoDB不強制要求被引用的列是UNIQUE或NOT NULL。對非惟一索引或者包含NULL值的索引進行外鍵引用,對於像upadte或delete cascade這樣的操做沒有很好的定義。所以,建議只對惟一非空索引或主鍵進行外鍵引用。
MySQL解析但忽略「內聯引用說明」,其中引用被定義爲列說明的一部分。僅當references子句被指定爲單獨的foreign key說明的一部分時,纔會被MySQL接受。
reference_option
表選項
1. create index
語法:create「unique | fulltext | spatial」index「idx_name」on「tbl_name」(indexed_col_name, ...) [index_option]
功能:建立新的索引
選項和參數:
indexed_col_name:col_name [(length)]
index_option:
key_block_size [=] value
index_type
index_type:
using {BTREE | HASH}
示例:
create index idx_test1 on employee (sex, name);
create unique index idx_test2 on employee (id, name) using BTREE;
說明:
① create index被映射爲alter table語句,用以建立索引。請注意,create index不能建立主鍵,建立主鍵需使用alter table;
② 一般應該在建立表的同時,即create table語句中,建立所需的所有索引。對於InnoDB表尤其如此,由於InnoDB表的主鍵決定了數據文件中行的物理佈局。create index語句的做用是幫助你向已經存在的表中添加索引;
③ (col1, col2, ...)形式的列列表用於建立一個多列索引(組合索引),此時索引鍵的鍵值由全部列值組合而成;
④ 全部存儲引擎都容許惟一索引在可爲NULL的列上同時包含多個NULL值;
⑤ 支持空間數據類型(POINT和GEOMETRY)的存儲引擎有:InnoDB, MyISAM, NDB和ARCHIVE;
1.1 建立前綴索引
對於字符串類型的列,可使用值的前綴來建立索引
語法:create index「idx_name」on「tbl_name」(col_name(length));
參數:col_name(length)用於指定索引前綴長度
優點:使用前綴索引可使索引文件更小,這樣能夠節省大量磁盤空間,甚至還能夠加速insert操做
說明:
① 能夠爲char, varchar, binary和varbinary類型的列建立前綴索引;
② blob和text列必須使用前綴索引, 且只有InnoDB和MyISAM存儲引擎支持對blob和text列進行索引;
③ 前綴限制以字節爲單位。在create table, alter table, create index語句中,爲非二進制字符串類型(char, varchar, text)指定的前綴長度被解釋爲字符長度;爲二進制字符串類型(binary, varbinary, blob)指定的前綴長度則被解釋爲字節長度。在爲多字節字符集的非二進制字符串類型的列指定前綴長度時,應考慮到這一點;
④ 是否支持前綴索引以及前綴索引的長度限制,與存儲引擎有關。例如,正常狀況下InnoDB表的前綴限制爲767字節,若是開啓innodb_large_prefix選項則能夠長達3072字節;對於MyISAM表,前綴限制爲1000字節;
示例:
create index idx_name on customer (name(10));
該語句使用name列的前10個字符建立索引(假定name是非二進制字符串類型)
1.2 索引的特性
◇ 全文索引:
① 只有MyISAM存儲引擎支持全文索引;
② 索引列必須爲char, varchar或者text類型;
③ 必須索引整個列,不能使用列前綴(前綴長度自動被忽略);
◇ 空間索引:
① 只有MyISAM存儲引擎支持空間索引。爲其它存儲引擎指定空間索引將致使錯誤;
② 索引列不能爲NULL;
③ 必須索引整個列,不能使用列前綴;
◇ 普通索引(非空間索引):
① 只有InnoDB, MyISAM和MEMORY存儲引擎支持對能夠爲NULL的列進行索引;
② 只有InnoDB和MyISAM存儲引擎支持對blob和text列進行索引;
③ 除主鍵外,索引中的列能夠爲NULL;
④ 非空間索引的索引類型取決於存儲引擎,目前使用B-Tree;
⑤ 除POINT外,非空間索引中的空間列必須使用列前綴,必須指定列前綴長度,單位字節;
⑥ 除ARCHIVE外,全部支持空間數據類型的存儲引擎,都支持非空間索引;
1.3 索引選項
在索引列列表以後,能夠給出索引選項。index_option值能夠爲:
◇ key_block_size [=] value
對於MyISAM表,key_block_size用於指定索引鍵的塊大小,以字節爲單位。該值僅爲提示,若有必要,一個不一樣的大小將被使用。爲單個索引定義指定的key_block_size值將覆蓋表級別的key_block_size值
InnoDB存儲引擎不支持索引級別的key_block_size
◇ index_type
某些存儲引擎容許你在建立索引時指定索引類型,例如:
create index id_test on lookup (id) using BTREE;
下圖顯示了不一樣存儲引擎容許支持的索引類型。在有多個索引類型的狀況下,當沒有顯式給出索引類型說明符時,默認使用第一個。表中未列出的存儲引擎不支持在索引定義中使用index_type子句
index_type子句不能用於全文索引和空間索引。全文索引的實現依賴於具體的存儲引擎。空間索引固定被實現爲R-Tree
若是你指定的索引類型對存儲引擎無效,而另外一索引類型對該存儲引擎有效,且不影響查詢結果,那麼存儲引擎將使用有效的索引類型
◇ comment 'string'
索引定義能夠包含長達1024個字符的註釋