MySQL 數據表創建詳細SQL語法

Table 數據表創建


數據表創建


#語法規則1
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition, ...)
[table_options]
[partion_options]

#語法規則2
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition, ...)]
[table_options]
[partion_options]
select_statement

#語法規則3
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
{LIKE old_tbl_name | (LIKE old_tbl_name)}

#create_definition 語法 
create_definition:
    col_name column_definition
    | [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name, ...)
        [index_option] ....
    | {INDEX|KEY} {index_name} [index_type] (index_col_name)
        [index_option] ...
    | [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
        [index_name] [index_type] (index_col_name)
        [index_option] ...
    | [FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (index_col_name, ....)
      [index_option] ...
    | [CONSTRAINT [symbol]] FOREIGN KEY 
      [index_name] (index_col_name, ...) reference_definition
    | CHECK (EXPR)

#column_definition 語法
column_definition:
    data_type [NOT NULL | NULL] [DEFAULT default_value]
      [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]
      [COMMENT 'string']
      [COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]
      [STORAGE {DISK|MEMMORY|DEFAULT}]
      [reference_definition]

#data_type 語法 
data_type:
    BIT[(length)]
  | TINYINT[(length)] [UNSIGNED] [ZEROFILL]
  | SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
  | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
  | INT[(length)] [UNSIGNED] [ZEROFILL]
  | INTEGER[(length)] [UNSIGNED] [ZEROFILL]
  | BIGINT[(length)] [UNSIGNED] [ZEROFILL]
  | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
  | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
  | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
  | DECIMAL[(length[,decimals])] [UNSIGNED] [ZEROFILL]
  | NUMERIC[(length[,decimals])] [UNSIGNED] [ZEROFILL]
  | DATE
  | TIME
  | TIMESTAMP
  | DATETIME
  | YEAR
  | CHAR[(length)] [BINARY]
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | VARCHAR(length) [BINARY]
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | BINARY[(length)]
  | VARBINARY(length)
  | TINYBLOB
  | BLOB
  | MEDIUMBLOB
  | LONGBLOB
  | TINYTEXT [BINARY]
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | TEXT [BINARY]
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | MEDIUMTEXT [BINARY]
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | LONGTEXT [BINARY]
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | ENUM(value1,value2,value3,...)
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | SET(value1,value2,value3,...)
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | spatial_type

#index_col_name 語法 
col_name:
    col_name [(length)] [ASC|DESC]  #INDEX (name(3) ASC, email) 

#index_type 語法 
index_type:
    USING {BTREE | HASH} # INDEX index_username_length_3  BTREE (username(3) ASC)

#index_option 語法 
index_option:
    KEY_BLOCK_SIZE [=] value 
  | index_type 
  | WITH PARSER parser_name
  | COMMENT 'string'

#reference_definition 語法
reference_definition:
    REFERENCES tbl_name (index_col_name, ...)
    [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

# reference_option 語法
reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION

#table_options 語法:
table_options:
    table_option [[,] table_option] ...

#table_option 語法:
table_option:
    ENGINE [=] engine_name
  | AUTO_INCREMENT [=] value
  | AVG_ROW_LENGTH [=] value #指定行的平均長度
  | MAX_ROWS [=] value # 和AVG_ROW_LENGTH 配合計算標的最大容量
  | MIN_ROWS [=] value
  | [DEFAULT] CHARACTER SET [=] charset_name
  | CHECKSUM [=] {0|1}
  | [DEFAULT] COLLATE [=] collation_name
  | DATA DIRECTORY [=] 'absolute path to directory'
  | DELAY_KEY_WRITE [=] {0 | 1}
  | INDEX DIRECTORY [=] 'absolute path to directory'
  | INSERT_METHOD [=] { NO | FIRST | LAST }
  | KEY_BLOCK_SIZE [=] value
  | PACK_KEYS [=] {0 | 1 | DEFAULT}
  | PASSWORD [=] 'string'
  | ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
  | TABLESPACE tablespace_name [STORAGE {DISK|MEMORY|DEFAULT}]
  | UNION [=] (tbl_name[,tbl_name]...)

#partition_options 語法
partition_option:
    PARTITION BY
        { [LINEAR] HASH (expr)
        | [LINEAR] KEY [ALGORITHM = {1|2}] (column_list)
        | RANGE {(expr) | COLUMNS(column_list)}
        | LIST {(expr) | COLUMNS(column_list)}}
        [PARTITIONS num]
        [SUBPARTITION BY
          { [LINEAR] HASH(expr)
            | [LINEAR] KEY [ALGORITHM = {1|2}] (column_list)
          }
          [SUBPARTITION num]
        ]
        [(partition_definition [, partition_definition] ...)]

#partition_definition 語法
partition_definition:
    PARTITION partition_name
        [VALUES 
            {LESS THAN {(expr | value_list) | MAXVALUE} 
            | 
            IN (value_list)}]
        [[STORAGE] ENGINE [=] engine_name]
        [COMMENT [=] 'comment_text' ]
        [DATA DIRECTORY [=] 'data_dir']
        [INDEX DIRECTORY [=] 'index_dir']
        [MAX_ROWS [=] max_number_of_rows]
        [MIN_ROWS [=] min_number_of_rows]
        [TABLESPACE [=] tablespace_name]
        [NODEGROUP [=] node_group_id]
        [(subpartition_definition [, subpartition_definition] ...)]

#subpartition_definition 語法:
subpartition_definition:
    SUBPARTITION logical_name
        [[STORAGE] ENGINE [=] engine_name]
        [COMMENT [=] 'comment_text' ]
        [DATA DIRECTORY [=] 'data_dir']
        [INDEX DIRECTORY [=] 'index_dir']
        [MAX_ROWS [=] max_number_of_rows]
        [MIN_ROWS [=] min_number_of_rows]
        [TABLESPACE [=] tablespace_name]
        [NODEGROUP [=] node_group_id]

select_statement:
    [IGNORE | REPLACE] [AS] SELECT ...   (Some valid select statement)             

注意:創建表之前首先得具有CREATE權限,如果沒有權限,表已經存在,沒有聲明引用的數據庫將引發錯誤

複製(克隆)表
 CREATE TABLE new_tbl LIKE old_tbl;
從另一張表創建
#創建新表並複製另一張表的所有數據
CREATE TABLE new_tbl [AS] SELECT * FROM old_tbl;

#創建新表並複製另一張表的部分數據
CREATE TABLE new_tbl (
    id INT(11) UNSIGNED NOT NULL PRIMARY KEY,
    name VARCHAR(32) NOT NULL,
    UNIQUE KEY (name) 
)ENGINE = InnoDB
AS
SELECT id,name FROM user;
臨時表

臨時表只存在於當前會話,噹噹前會話結束的時候,臨時表將被自動清除,創建臨時表使用TEMPORARY關鍵字

同名表

使用關鍵字 IF NOT EXISTS 可以避免當同名表出現時的錯誤;

物理存儲

MySQL 將表的定義存儲在數據庫目錄下一個名爲tbl_name.frm文件中;

對於InnoDB存儲引擎的數據表,如果配置項innodb_file_per_table被打開,則每個表被創建的時候都會有一個 .ibd 格式的文件生成,用於存儲表數據和表索引,當這個配置項關閉的時候,InnoDB存儲引擎的數據表文件都存儲在系統的 ibdata* 文件中;

文件 作用
tbl_name.frm 表結構定義
tbl_name.MYD 存儲表數據
tbl_name.MYI 存儲表索引
數據類型和表屬性

並不是所有的屬性都可以運用所有的數據類型,AUTO_INCREMENT 只可以運用於整數類型和浮點類型,DEFAULT 類型不能用於 BLOB 和 TEXT 類型

  1. 數據列沒有指定NULL或者NOT NULL 屬性時,則被視爲 可空;
  2. 如果一個具有AUTO_INCREMENT屬性的(INTEGER或者FLOAT)列被插入爲一個NULL或者0,那麼它將自動更新爲下一個自增至,通常是value + 1,value 爲該數據表中當前列的最大值;但是如果NO_AUTO_VALUE_ON_ZERO模式被開啓的時候,允許0值被存儲在該列中;需要注意的是每張表只能有一列爲AUTO_INCREMENT屬性,而且這裏必須被索引,且不能有DEFAUL值,而且只存儲正數,當插入一個負數的時候相當於插入一個很大的正值;
  3. VARCHAR,CHAR,TEXT 列可以聲明DEFAULT CHARACTER SET 和 COLLATE 屬性;
    CREATE TABLE IF NOT EXISTS tbl_char (TEXT(20) NOT NULL CHARACTER SET utf8 COLLATE utf8_general_ci);
  4. DEFAULT 用於聲明一列的默認值,但他必須是常量;這也就是意味着你不能設置一個日期列的默認值值爲NOW()或者CURRENT_DATE,但是例外的是你可以設置一個TIMESTAMP列的默認值爲CURRENT_TIMESTAMP;還有需要注意的是,對於一個日期屬性的默認值,它必須是和 NO_ZERO_IN_DATE 設置相對應,否則將會引發錯誤;
    birthday DATE DEFAULT ‘2010-00-00’ #將會導致一個錯誤,Invalid default value for ‘c1’
  5. COMMENT 屬性用於解釋一個列,它會在SHOW CREATE TABLE 和 SHOW FULL COLUMNS 中顯示;
  6. KEY 通常情況下和 INDEX 是一個同義詞;
  7. 一個PRIMARY KEY 列是具有UNIQUE 屬性且NOT NULL,如果沒有顯示聲明MySQL將會隱式聲明。PRIMARY KEY 通常被寫作PRIMARY,每張表也只能有一個PRIMARY 索引;
    如果表中沒有PRIMARY KEY ,但是一個應用請求PRIMARY KEY時,MySQL將會返回一個UNIQUE且NOT NULL 的列;

    儘量保持PRIMARY KEY 最短以減少存儲次要索引的開銷,每個次要索引都會保存一個對應行中主鍵列的副本;
  8. 在創建表的時候,首先聲明PRIMARY KEY,然後是UNIQUE KEY, 最後是NO UNIQUE INDEX,這將幫助MySQL優化器去排序哪個索引被使用以及更快的檢測重複值;
  9. 你可以聲明一個多列的PRIMARY KEY ,例如 PRIMARY KEY (columna, column2);
  10. If a PRIMARY KEY or UNIQUE index consists of only one column that has an integer type, you can also refer to the column as _rowid in SELECT statements.
  11. 在MySQL中,PRIMARY KEY 的 索引名稱 是 PRIMARY,對於其他的索引類型,如果沒有聲明一個索引名稱,MySQL將次索引名稱設置爲第一列的列明,附加可選的後綴(_2,_3,…)使其唯一;
  12. 對於VARCHAR,CHAR,BINARY,VARBINARY列,索引可以被設置只去索引該列一部分,如 INDEX (col_name(10)),但是對於BLOB和TEXT列,長度是必須設置的;前綴長度在字符串類型中表示長度,在二進制類型中表示索引的字節數,也就是說索引包括(VARVHAR,CHAR,TEXT)第一個字符 或者(BINARY,VARBINARY,BLOB)第一個字節,像這樣僅僅索引一列的前幾個字符可以使索引文件更小;
    CREATE TABLE IF NOT EXISTS posts (content TEXT NOT NULL, INDEX (content(10)))ENGINE = InnoDB;
  13. 索引列名末尾可以跟上ASC或者DESC,不過此關鍵字目前會被忽略;
存儲引擎
引擎 描述
InnoDB 支持事務,外鍵,行級鎖,默認存儲引擎
MyISAM 適合存數二進制數據,在大量讀的情況下具有很大優勢

其他的不做描述

性能優化

這裏只提幾個常用的屬性

  1. AUTO_INCREMENT [=] value , 下一個自增值,可在CREATE TABLE 聲明或者ALTER TABLE 中重置;
  2. [DEFAULT] CHARACTER SET 設置字符集;
  3. [DEFAULT] COLLATE 設置排序規則;
  4. ENGINE [=] 設置標的存儲引擎;
創建分區表
  1. HASH(expr)分區,基於用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算。這個函數可以包含MySQL 中有效的、產生非負整數值的任何表達式。

        CREATE TABLE t1 (col1 INT, col2 CHAR(5)) PARTITION BT HASH(col1);
        CREATE TABLE t2 (col1 INT, col2 CHAR(5), col3 DATETIME) PARTITION BY HASH(YEAR(col3));

    用戶可以指定的分區個數最多爲1024,在HASH分區中,可以不用VALUES LESS THAN 或者 VALUES IN 語句;

  2. KEY [ALGORITHM = {1|2}] (column_list):類似於按HASH分區,區別在於KEY分區只支持計算一列或多列(最多16列);

        CREATE TABLE t1 (col DATE) PARTITION BY KEY(col) PARTITIONS 5;
        CREATE TABLE t1 (col DATE) PARTITION BY LINEAR KEY(col) PARTITIONS 5;
  3. RANGE(expr) 或者 RANGE COLUMNS(column_list) 基於屬於一個給定連續區間的列值,把多行分配給分區。

    CREATE TABLE t1 (
        year_col  INT,
        some_data INT
    )
    PARTITION BY RANGE (year_col) (
        PARTITION p0 VALUES LESS THAN (1991),
        PARTITION p1 VALUES LESS THAN (1995),
        PARTITION p2 VALUES LESS THAN (1999),
        PARTITION p3 VALUES LESS THAN (2002),
        PARTITION p4 VALUES LESS THAN (2003),
        PARTITION p5 VALUES LESS THAN MAXVALUE
    );
    
    #這種分區常用語多個條件
    
    CREATE TABLE t2 (
        a INT NOT NULL,
        b INT NOT NULL
    )
    PARTITION BY RANGE COLUMNS(A,B)(
        PARTITION p1 VALUES LESS THAN (5,10),
        PARTITION p2 VALUES LESS THAN (20,10),
        PARTITION p3 VALUES LESS THAN (MAXVALUE, MAXVALUE),
    );
  4. LIST(expr) 或者 LIST COLUMNS(column_list) 類似於按RANGE分區,區別在於LIST分區是基於列值匹配一個離散值集合中的某個值來進行選擇.

    CREATE TABLE client_firms (
        id   INT,
        name VARCHAR(35)
    )
    PARTITION BY LIST (id) (
        PARTITION r0 VALUES IN (1, 5, 9, 13, 17, 21),
        PARTITION r1 VALUES IN (2, 6, 10, 14, 18, 22),
        PARTITION r2 VALUES IN (3, 7, 11, 15, 19, 23),
        PARTITION r3 VALUES IN (4, 8, 12, 16, 20, 24)
    );
    CREATE TABLE lc (
        a INT NULL, 
        b INT NULL
    )
    PARTITION BY LIST COLUMNS(a,b) (
        PARTITION p0 VALUES IN( (0,0), (NULL,NULL) ),
        PARTITION p1 VALUES IN( (0,1), (0,2), (0,3), (1,1), (1,2) ),
        PARTITION p2 VALUES IN( (1,0), (2,0), (2,1), (3,0), (3,1) ),
        PARTITION p3 VALUES IN( (1,3), (2,2), (2,3), (3,2), (3,3) )
    );
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章