[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`;
~~~
* 運行結果:

* * * * *
#### 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`;
~~~
* 運行結果如下:

* * * * *
#### 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`;
~~~
* 運行結果:

* 如果想修改數據表的當前主鍵,并將主鍵起始值設置為指定值,可這樣操作:
~~~
# 修改一下表結構,設置主鍵和約束條件
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`;
~~~
* 運行結果:

* * * * *
#### 5、數據表更名
* 語法:
>[info] 數據表更名有二種方法,用哪個都可以完成
~~~
#語法一:
ALTER TABLE 原表名 RENAME 新表名 ;
# 語法二:
RENAME TABLE 原表名 TO 新表名 ;
~~~
* 語句
~~~
#語法一:
ALTER TABLE `tp5_staff` RENAME tp_user;
# 語法二:
RENAME TABLE tp5_staff TO tp_user;
~~~
* 運行結果:

* * * * *
#### 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`;
~~~
* 運行效果:

* * * * *
#### 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';
~~~
* 運行效果如下:

* * * * *
#### 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;
~~~
* 運行效果:

* 下面再演示一下刪除salary默認值
* 語句如下:
~~~
#將salary字段默認值刪除
ALTER TABLE `tp5_staff` ALTER salary DROP DEFAULT ;
#新增記錄,沒有設置salary
INSERT `tp5_staff` (name,sex) VALUES ('歐陽峰',1);
#查詢全部記錄
SELECT * FROM `tp5_staff` LIMIT 100;
~~~
* 運行效果

* 刪除數值型字段默認值后,系統自動設置為: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.查詢/子查詢/連接查詢