[TOC]
## 编辑数据表结构
>[info] 本节只介绍开发中最常用的部分,更多内容,请参考MySQL手册
#### 基本语法:
~~~
ALTER TABLE 表名 [ADD ...] [DROP ... ] [CHANGE ...] [ RENAME ...]
~~~
####语句看上去并不复杂,下面我用一个个实例演示用法
* * * * *
#### 1、添加字段
* 语法:
~~~
ALTER TABLE 表名 ADD 新字段名 字段类型 约束条件 [AFTER 字段名] [FIRST]
~~~
>[info] FIRST :添加到表中第一个字段之前!
默认情况下,新添加的字段做为表的最后一个字段。
* 实例:tp5_staff表sex字段后添加新字段:age(年龄),要求整型、无符号、不为空、默认值为22;
* 语句如下:
~~~
#添加新字段:age(年龄),要求整型、无符号、不为空、默认值为22,加到sex字段后面
ALTER TABLE `tp5_staff` ADD age TINYINT(3) UNSIGNED NOT NULL DEFAULT '22' AFTER sex;
#查看增加age字段后的表结构
DESC `tp5_staff`;
~~~
* 运行结果:
![](https://box.kancloud.cn/95909a3d98eaef38d28afca7f9305dd9_1019x747.png)
* * * * *
#### 2、修改字段名称
* 语法:
~~~
ALTER TABLE 表名 CHANGE 原字段名 新字段名 原字段类型 原约束条件 ;
~~~
>[danger] 1、哪怕仅仅是修改字段名称,新字段的类型也必须给出;
2、如果仅仅修改字段名称,那么最好在修改之前,查询一下原表要修改的字段类型和约束条件(DESC 表名),防止原来存储的数据因类型不对而出错;
* 实例:将tp5_staff表sex字段修改为xb,其它内容不变;
* 语句如下:
~~~
#添加新字段:age(年龄),要求整型、无符号、不为空、默认值为22,加到sex字段后面
ALTER TABLE `tp5_staff` CHANGE sex xb TINYINT(2) UNSIGNED NOT NULL DEFAULT 1;
#查看增加age字段后的表结构
DESC `tp5_staff`;
~~~
* 运行结果如下:
![](https://box.kancloud.cn/e01fd3989d951a7946189c89252f6054_1043x775.png)
* * * * *
#### 3、修改字段名称和类型
>[info] 其实与上面的语法基本是一样的。
1、如果仅修改类型,只要将新字段名,设置与原字段同名即可。
2、新字段后面要写新的类型和约束条件等,不要复制原来字段的内容。
* 语法:
~~~
ALTER TABLE 表名 CHANGE 原字段名 新字段名 新字段类型 新约束条件 ;
~~~
* 实例:tp5_staff表中,salary字段变更为gz,类型修改成INT(8),无符号、不为空;
* 语句:
~~~
#将salary字段变更为gz,类型变更为INT(8),无符号,不为空
ALTER TABLE `tp5_staff` CHANGE salary gz INT(8) UNSIGNED NOT NULL ;
#查看字段变更后的表结构
DESC `tp5_staff`;
~~~
* 运行结果:
![](https://box.kancloud.cn/83225d583dd92f5fb922862a5040200c_1043x775.png)
* 如果想修改数据表的当前主键,并将主键起始值设置为指定值,可这样操作:
~~~
# 修改一下表结构,设置主键和约束条件
ALTER TABLE 表名 CHANGE id id INT(4) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT ;
#设置自增起始于1001
ALTER TABLE 表名 AUTO_INCREMENT = 自增主键起始值 ;
~~~
* * * * *
#### 4、删除字段
>[danger] 删除字段是不可撤消的操作,所以删除字段之前,请确保该字段值已无效
* 语法:(非常简单)
~~~
ALTER TABLE 表名 DROP 要删除的字段名 ;
~~~
* 实例:删除tp5_staff表中的job 字段
>[info] 为不了破坏原数据,我们新建一个字段来演示删除操作
* 语句:
~~~
# 先添加一个job字段
ALTER TABLE `tp5_staff` ADD job CHAR(20) NOT NULL ;
#查看是否添加成功
DESC `tp5_staff`;
#删除刚添加的job字段
ALTER TABLE `tp5_staff` DROP job;
#查看是否删除成功
DESC `tp5_staff`;
~~~
* 运行结果:
![](https://box.kancloud.cn/4113d9f93723388479b859751dc8de10_1198x924.png)
* * * * *
#### 5、数据表更名
* 语法:
>[info] 数据表更名有二种方法,用哪个都可以完成
~~~
#语法一:
ALTER TABLE 原表名 RENAME 新表名 ;
# 语法二:
RENAME TABLE 原表名 TO 新表名 ;
~~~
* 语句
~~~
#语法一:
ALTER TABLE `tp5_staff` RENAME tp_user;
# 语法二:
RENAME TABLE tp5_staff TO tp_user;
~~~
* 运行结果:
![](https://box.kancloud.cn/8ede212dabd363db9862e64b29fe0620_1075x775.png)
* * * * *
#### 6、添加索引
>[info] 可以同时给数据表添加多个索引,字段一旦设置了索引,其值将按顺序排列,可以极大的加快查询速度,特别是大量数据读取时,速度提升明显。
所以,对于查询频繁的字段,创建索引是非常有必要的。
* 语法:
~~~
ALTER TABLE 表名 ADD INDEX (字段名) [ , ADD INDEX (字段名) ];
~~~
* 实例:给tp5_staff表中的name字段,salary 字段添加索引
* 语句:
~~~
# 在name字段,salary字段创建索引,加快查询速度
ALTER TABLE `tp5_staff` ADD INDEX (name), ADD INDEX (salary);
#经测试,salary字段经过索引后,已按升序输出
SELECT salary FROM `tp5_staff`;
~~~
* 运行效果:
![](https://box.kancloud.cn/a8f87ba80dd265cf90d68c798489e336_1054x775.png)
* * * * *
#### 7、其它数据表编辑操作
>[info] 有些数据表编辑操作使用频率不高,做为了解即可
* 如果仅仅修改字段类型,除了可以用CHANGE关键字后,还可以用MODIFY;
* 修改数据表的存储引擎
~~~
#修改数据表引擎
ALTER TABLE 表名 ENGINE = MyISAM 或者 InnoDB
~~~
* 修改数据表默认字符集
~~~
#修改数据表默认字符集
ALTER TABLE 表名 DEFAULT CHARSET = 编码集
~~~
* 实例:将tp_staff 表存储引擎变更成:InnoDB
* 语句:
~~~
#查看变更之前的引擎状态
show table status from tp5 where name= 'tp5_staff';
#变更引擎
alter table `tp5_staff` engine=InnoDB;
#查看变更之后的引擎
show table status from tp5 where name='tp5_staff';
~~~
* 运行效果如下:
![](https://box.kancloud.cn/5ae167657df7862514fb72167a988b8f_1054x775.png)
* * * * *
#### 8、设置或删除字段默认值
##### 掌握语句中ALTER关键字的用法
>[info] 一般来说,如果字段有默认值,在创建数据表时,就设置好了。但凡事总有例外,当你发现原来的默认值已不符合需求,或者新加的字段忘记了设置默认值时,可以用这个语句进行单独设置。
* 语法
~~~
#设置默认值
ALTER TABLE 表名 ALTER 字段名 SET DEFAULT 默认值;
#删除默认值
ALTER TABLE 表名 ALTER 字段名 DROP DEFAULT 默认值;
~~~
* 实例:将salary 字段默认值设置为5000
* 语句:
~~~
#设置salary字段默认值为5000
ALTER TABLE `tp5_staff` ALTER salary SET DEFAULT 5000;
#新增记录,没有设置salary,则salary 取默认值 5000
INSERT `tp5_staff` (name,sex) VALUES ('老顽童',1);
#查询全部记录
SELECT * FROM `tp5_staff` LIMIT 100;
~~~
* 运行效果:
![](https://box.kancloud.cn/6ae2039a325f803897fe2538eb5f351d_1057x775.png)
* 下面再演示一下删除salary默认值
* 语句如下:
~~~
#将salary字段默认值删除
ALTER TABLE `tp5_staff` ALTER salary DROP DEFAULT ;
#新增记录,没有设置salary
INSERT `tp5_staff` (name,sex) VALUES ('欧阳峰',1);
#查询全部记录
SELECT * FROM `tp5_staff` LIMIT 100;
~~~
* 运行效果
![](https://box.kancloud.cn/63679551ae77138d99adcd1ee0e384b9_1029x747.png)
* 删除数值型字段默认值后,系统自动设置为:0
* * * * *
### 总结
>[success] 数据表结构修改是非常重要的,因为我们在开发过程中,很难将数据表设计的一步到位,随着项目开发进度,用户需求的变化,数据表变更再所难免。</span>
#### 所以,这项技能,必须掌握!
- 前言[随时更新]
- 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.查询/子查询/连接查询