前面在查建表時key和index的區別時,發現建表語句包含了太多信息,因而完整看看官方手冊的這一小節。html
該文章根據MySQL 5.7的手冊做筆記,而MySQL 8.0該節地址以下:mysql
https://dev.mysql.com/doc/refman/8.0/en/create-table.htmlsql
〇、概述數據庫
CREATE TABLE建立一個使用指定名稱的table,固然前提是用戶擁有CREATE權限。express
經常使用的簡單的建表語句:優化
/*建表的語法*/ create table [if not exist] Table_name( 字段一 數據類型 [字段屬性|約束] [索引] [註釋] , 字段二 數據類型 [字段屬性|約束] [索引] [註釋] , ......... )[表類型][表字符集][註釋] /*建立一個InnoDB類型,字符集爲utf-8,備註爲「test Table」的表*/ /*在這裏,我驚喜地發現,單引號、雙引號能夠使用在comment關鍵字中!!*/ create table test(id int(4))engine=innodb,charset=utf8,comment="test Table";
默認狀況下,表會建立在當前數據庫下(use database決定當前使用的數據庫),並使用默認的存儲引擎(InnoDB)。spa
如下狀況會報錯:code
關於表的物理表示的信息會在第二節講述。htm
而建立表時,MySQL會存儲原始的CREATE TABLE語句,包括全部規範和表選項。這是接下來第一節的內容blog
如今要談到的是CREATE TABLE的如下幾個方面:
0.1 Table Name
關於Table_name:
能夠被指定爲database_name.table_name,就能夠直接在指定的數據庫中建立表。
固然,若是要使用引號,對db_name和tb_name都要使用引號,`da_name`.`tb_name`。(事實上,這裏的並非‘’這種符號,而是鍵盤上左上角的「~」鍵)
table名的命名規約在9.2章節。
關於 IF NOT EXISTS:
阻止錯誤發生。儘管並不會驗證已經存在的表是否與要建立的表具備徹底一致的表結構。
0.2 Temporary Tables
能夠在建表時使用「Temporary 」關鍵字,那麼所建立的臨時表只會在當前會話中可見,會話關閉後,該數據庫就會被自動刪除。
0.3 Cloning or Copying a Table
Like
使用「create table ... like」來基於其它表的定義建立一個空表,新表包括了列的全部屬性有以及索引。
CREATE TABLE new_tbl LIKE orig_tbl;
[as] query_expression
根據一個查詢結果集,建立一個包含這些數據的新表。
CREATE TABLE new_tbl AS SELECT * FROM orig_tbl;
IGNORE | REPLACE
這兩個選項代表,當根據select語句建立表時,該如何處理複製惟一鍵值的行。(how to handle rows that duplicate unique key values when copying a table using a SELECT statement.)
0.4 Column Data Types and Attributes
這些就是表的字段定義了。字段的數據類型、屬性等。
每一個表的硬限制爲4096列,但實際上限會小一些,着取決於一些其它因素。
這裏的選項太多,稍後再聊。
0.5 Indexs And Foreign Keys
0.6 Table Options
Table Options被用來對錶的行爲進行優化。
在大多數狀況下,不須要指定任何選項。
這些選項會應用於全部的存儲引擎,除非特別指出。若一個表決定不該用這些選項,這會被記做表定義的一部分。若是稍後使用ALTER TABLE將錶轉換爲使用不一樣的存儲引擎,則又能夠應用這些選項。
表選項也特別多,常見的如指定engine、charset。
0.7 Creating Partitioned Tables
可用於控制使用CREATE TABLE建立的表的分區。
選項也不少
0.8 Partitioning by Generated Columns
容許根據生成列進行分區。
1、CREATE TABLE Statement Retention(語句保留)