[TOC]
## DDL-表的操作
## 一、創建表
**基本語法為:**
~~~
?create table table_name(
? ? column_name_1 data_type constrains,
? ? column_name_2 data_type constrains,
? ? ...
? ? column_name_x data_type constrains,
? ? column_name_n data_type constrains
?);
~~~
其中,column\_name 是列的名字,data\_type 是列的數據類型,constrains 是此列的約束條件。
例如,創建一個表 people:
~~~
?mysql> create table people(
? ? -> name varchar(10) not null,
? ? -> age int(2),
? ? -> birthday date,
? ? -> address varchar(100)
? ? -> );
?Query OK, 0 rows affected (0.04 sec)
~~~
其中,not null 便是約束條件,表示默認不為空。
### 0.創建表的完整語法:
~~~
?create [temporary] table [if not exists] table_name(
? ? create_definition,
? ? ...
?)[table_options] [partition_options];
~~~
* `temporary` :臨時表,會話結束時自動消失;
* `if not exists` :當不存在此表時,順利創建,若已存在則會顯示警告;
* `create_definition` :表的創建定義,即字段的定義;
* `table_options`:表選項,設置表的字符集、存儲引擎、文件目錄等;
* `partition_options` :分區選項,便于管理非常大的表。
### 1.create\_definition-表的創建定義
表的創建定義 create\_definition 即 **字段的定義**,每個字段的定義以逗號(英文)結束,最后一個字段后不能有逗號,每個字段必須有數據類型,約束條件可選。
對于字段的定義:
~~~
?column_name data_type [not null | null] [default default_value] [auto_increment] [unique key | primary key] [comment 'comment_string'];
~~~
#### a、`[not null | null]` :
* mysql 默認設置為 null;此時插入一行數據時,若沒設置該字段值,則該字段值為 null;null 作為占位符;
* 建議設置為 not null ,比 null 的效率要好許多;B 樹索引時不會存儲 NULL 值的,所以如果索引的字段可以為 NULL,索引的效率會下降很多。在 MyISAM 引擎下,NULL 對索引、索引統計、磁盤占用都會有額外的開銷,一個允許為 NULL 的列,每個字段的長度都比 NOT NULL 的多 1bit。
* mysql 中的 null 其實是占用空間的占位符,而空值是不占用空間的;
* not null 的字段是不能插入 ‘null’ 的,只能插入空值 `''` (單引號之間是沒有空格的);
#### b、`[default default_value]`:
因為一般建議設置字段時是設置為 not null 的,所有一般都會給字段設置有默認值。如數值類型設置為 0,字符串設置為空值 `''` 。
特別當開發中 mysql 啟用嚴格模式(strict mode)時,更應顯示指定默認值。
#### c、`[auto_increment]`:
設置字段的自增,取值范圍是 1 至 65535;默認從 1 開始,可在創建表時的表選項中用 `AUTO_INCREMENT=n` 來指定自增的初始值。
設置 auto\_increment 的數據列數據類型必須為整型正數,且必須有唯一索引(primary key 或 unique key),必須具備 not null 屬性(當設置了索引時會自動設置為not null)。
當插入記錄時,若沒有為 auto\_increment 字段明確指定值,則等同插入 null值;若插入 null 值或者 0 時,該字段將自動生成下一個序列編號。當插入或更新記錄為 auto\_increment 字段明確指定值,如果該值和已有的編號重復則會報錯;如果該值大于已編號的值,下一個編號將該值開始遞增;如果該值小于已編號的值,則僅僅該記錄改動。
#### d、`[unique key | primary key]` :
設置特殊索引 key:
* primary key 主鍵索引:唯一標識數據庫表中的每條記錄;主鍵必須包含唯一的值;主鍵列不能包含 NULL 值;每個表都應該有一個主鍵,并且每個表只能有一個主鍵。(PRIMARY KEY 擁有自動定義的 UNIQUE 約束);
* UNIQUE 約束:唯一標識數據庫表中的每條記錄。 UNIQUE 和 PRIMARY KEY 約束均為列或列集合提供了唯一性的保證。(每個表可以有多個 UNIQUE 約束,但是每個表只能有一個 PRIMARY KEY 約束)
#### e、`[comment 'comment_string']` :
設置該字段的注釋 ,便于理解該字段的意義,建議為每個字段加上清晰明了的注釋。
### 2.table\_options-表選項