[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-表选项