前面在查建表時key和index的區別時,發現建表語句包含了太多信息,於是完整看看官方手冊的這一小節。
該文章根據MySQL 5.7的手冊作筆記,而MySQL 8.0該節地址如下:
https://dev.mysql.com/doc/refman/8.0/en/create-table.html
〇、概述
CREATE TABLE創建一個使用指定名稱的table,當然前提是用戶擁有CREATE權限。
常用的簡單的建表語句:
/*建表的語法*/ 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)。
以下情況會報錯:
- 當前沒有使用任何數據庫,或者要使用的數據庫不存在;
- 數據庫中已經存在同名表
關於表的物理表示的信息會在第二節講述。
而創建表時,MySQL會存儲原始的CREATE TABLE語句,包括所有規范和表選項。這是接下來第一節的內容
現在要談到的是CREATE TABLE的以下幾個方面:
- Table name
- Temporary Tables
- Cloning or Copying a Table
- Column Data Types and Attributes
- Indexes and Foreign Keys
- Table Options
- Creating Partitioned Tables
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
允許根據生成列進行分區。
一、CREATE TABLE Statement Retention(語句保留)