[TOC]
## 创建数据表
#### 1、基本语法:
~~~
CREATE TABLE IF NOT EXISTS 数据表名称 (
字段名称1 [AS 别名] 字段类型 [约束条件] [DEFAULT 默认值] [COMMENT 字段注释],
字段名称2 [AS 别名] 字段类型 [约束条件] [DEFAULT 默认值] [COMMENT 字段注释],
字段名称3 [AS 别名] 字段类型 [约束条件] [DEFAULT 默认值] [COMMENT 字段注释],
......
)ENGINE = 表存储引擎 DEFAULT CHARSET = 默认编码集 AUTO_INCREMENT = 自增主键起始值;
~~~
#### 2、语法解释:
> * 字段名称:不与MySQL关键字重名的任何有效标识符即可;
>* `IF NOT EXISTS`:意思是“如果不存在”再创建数据表,防止重复建表引起错误;
>* `AS 别名`:表中字段名均为英文单词或缩写,创建一个有意义的别名,使数据表查询结果更加直观、人性化;
>* 字段类型:非常重要,本文后面有详细介绍;
>* 约束条件:主要是`NULL`(允许为空),`NOT NULL`(禁止为空)等,具体还要与字段类型相匹配;
>* `DEFAULT 默认值`:如某字段设置了默认值,则新增时未赋值则取默认值;
>* `COMMENT 字段注释`:非必须,但可以使字段信息看上去再完整、直观;
>* `ENGINE = 表存储引擎`:
>>* MyISAM:读取快速、成熟稳定、支持全文检索、最常用,但不支持事务处理;
>>* InnoDB:具备提交、回滚的事务处理,支持外键,战用空间大,不支持全文检索;
>* `DEFAULT CHARSET 默认编码集`: 通常与数据库采用的编码集相同(utf8)即可;
>* `AUTO_INCREMENT = 自增主键起始值`:如果设置,将从该值开始自增,如设置为1001,则第一条记录是1001,第二条是1002。如果不设置,主键将默认从1开始自增;
* * * * *
### 3、字段类型:
#### 字段类型也叫列类型,主要有:数值、字符串、日期/时间三大类。
1. 数值型:有无符号和有符号之分,直接书写,不要加引号,<span style="color:ForestGreen">长度仅影响显示,不影响精度。</span>
1. 整型:又分为五类
1. INT : 标准整型,4字节,取值范围大约正负21亿,足以应付正常开发需要;
2. SMALLINT:小整数,2字节,取值范围大约正负3.2万之间,无符号翻倍。
3. TINYINT:极小整数,1字节,取值-128~127,无符号:0~255。
4. 其它:MEDIUMINT(3字节),BIGINT(8字节),不太常用。
2. 浮点型:
1. FLOAT:最常用,用4字节或8字节表示,具体依平台而定;
2. DOUBLE:双精度8字节;
3. DECIMAL:以字符串形式存储的浮点数,大小自定义,用于会计领域等。
2. 字符串类型:
1. CHAR(长度): 固定宽度存储字符串,忽略原始字符串长度;
2. VARCHAR(长度):可变长度字符串,根据原始字符串长度存储;
3. TEXT:小型文本,不能设默认值和长度;
4. LONGTEXT:超大文本,同样不可设默认值和长度;
5. ENUM(枚举):在括号中集合数据中,只可以单选,无默认值;
6. SET(集合):集合最大64个成员,可以多选,无默认值。
3. 日期/时间类型(不要设置长度):
1. DATE:3字节,格式 YYYY-MM-DD,如 2016-10-20;
2. TIME:3字节,格式 hh:mm:ss,如 12:25:35;
3. DATETIME:8字节,格式 YYYY-MM-DD hh:mm:ss,如 2016-10-20 12:25:35;
4. TIMESTAMP:3字节时间戳,格式YYYYMMDDhhmmss共14位,可设置显示长度进行截取操作,必须是偶数长度,常见6位,8位,12位;
5. YEAR:单字节,格式 YYYY,显示年份,如2016。
* * * * *
### 4、约束条件:
> 主要有UNSIGNED、ZEROFILL、AUTO_INCREMENT、NULL / NOT NULL、DEFAULT等。
|序号| 约束条件 | 字段类型 | 说明 |
|---| --- | --- | --- |
|1 | UNSIGNED | INT , FLOATT等数值型 | 全是正数,范围扩大一倍 |
| 2 | ZEROFILL | INT , FLOAT 等数值型 | 宽度大于实际长度时补足前导零 |
|3 | AUTO_INCREMENT | INT |无符号、默认从1开始自增,接受NULL或空值 |
| 4 | NULL / NOT NULL |不限制 | 为空或不为空 |
| 5 | DEFAULT | 非TEXT类型或主键 | 添加新记录时没赋值,则取默认值 |
* * * * *
### 5、实例
##### 任务:创建员工信息表staff
staff数据表结构如下:
| 序号 | 字段名 | 类型 | 宽度 | 约束 | 默认值|备注 |
| --- | --- | --- | --- | --- | --- |
| 1 | id | 整型 | 4位 | 无符号、不为空、自增、主键|无 | 编号 |
| 2 | name | 变长字符串 | 30位 | 不为空 | 无 |姓名 |
| 3 | sex | 整型 | 1位 | 不为空 | 1 |性别1男0女|
| 4 | salary |浮点型 | 共10位小数2位 |无符号、不为空 |2000 |工资|
| 5 | dept |变长字符串 | 20位 |不为空 | 开发部 |部门|
| 6 | hiredate |日期 | 默认 | 不为空 | 0000-00-00 |入职日期|
要求数据表存储引擎为MyISAM,默认编码:utf8,自增主键起始:1001。
##### 创建数据表SQL语句:
~~~
CREATE TABLE IF NOT EXISTS staff (
id INT(4) unsigned NOT NULL AUTO_INCREMENT COMMENT '编号',
name VARCHAR(30) NOT NULL COMMENT '姓名',
sex TINYINT(2) unsigned NOT NULL DEFAULT 1 COMMENT '性别1男0女',
salary FLOAT(10,2) NOT NULL DEFAULT 2000.00 COMMENT '工资',
dept VARCHAR(20) NOT NULL DEFAULT '开发部' COMMENT '部门' ,
hiredate DATE NOT NULL DEFAULT '0000-00-00' COMMENT '入职日期',
PRIMARY KEY (id)
)ENGINE = MyISAM DEFAULT CHARSET = utf8 AUTO_INCREMENT = 1001;
~~~
##### 运行结果:
![](https://box.kancloud.cn/58783f5ffa8109d17eb33482ffb3e6d1_1076x775.png)
##### 查看表结构:
* 语法:`DESC 表名`
![](https://box.kancloud.cn/e19a6a06e2779ec10e1e479fa542e6b2_1076x775.png)
## 总结:
>[success] 数据表,是我们ThinkPHP开发中,数据库操作的重要载体。而创建数据表,则是最重要的一环。一个结构良好、健壮的表结构是我们所有模型操作的基础。
#### 请同学们,对于熟练创建数据表技能,给予足够重视!
- 前言[随时更新]
- ThinkPHP 5数据库重构
- 开发环境
- 1.ThinkPHP5开发环境(Mac版)
- 2.ThinkPHP5开发环境(Win版)
- MySQL快速复习
- 1.数据库操作
- 2.数据表操作
- 1.创建数据表 (重点)
- 2.添加数据表记录
- 3.查询数据表(重点)
- 4.更新数据表
- 5.编辑数据表结构(重点)
- 6_复制数据表
- 7.删除数据和表
- 连接数据库
- 1.数据库配置文件database.php
- 2.Db类静态方法connect()
- 3.模块中的配置文件config.php
- MySQL原生查询
- 1.读操作query
- 2.写操作execute
- 选择数据表
- 1.table与setTable方法
- 2.name方法
- 3.db助手函数
- 4.alias方法
- 结果集查询
- 1.find方法
- 2.select方法
- 3.fetchSql方法
- 4.value方法
- 5.column方法
- 6.field方法
- 新增数据
- 1.insert_单条添加
- 2.insertAll_批量添加
- 3_db_助手函数添加
- 更新数据
- 1.update方法
- 2.setField更新字段
- 3_自增自减与延时更新
- 删除数据
- 1.delete方法
- 查询方法
- 1.getTableInfo方法
- 2.where方法
- 3.whereOr方法
- 4.混合查询(闭包实现)
- 表达式查询
- 1.表达式查询(重点)
- 2.exp通用查询
- 分组查询
- 1.group方法
- 2.having方法
- 排序分页查询
- 1.order方法
- 2.limit方法
- 3.page方法
- 聚合查询
- 时间查询
- 1.where方法
- 2.whereTime方法
- 高级查询
- 1.快捷查询
- 2.区间查询
- 3.批量查询
- 4.Query对象查询
- 5.混合查询
- 视图查询
- view方法
- 子查询
- 1.select方法
- 2.fetchSql方法
- 3.buildSql方法
- 4.闭包子查询
- 总结/参考
- 1.方法参数类型总结
- 2.查询/子查询/连接查询