
本資料為產(chǎn)品崗位作為日常工作參考,語言口語化
At 2019/4/15 By David.Yang
修改一張數(shù)據(jù)表
隨著業(yè)務(wù)發(fā)展,會出現(xiàn)數(shù)據(jù)表無法支撐當(dāng)前業(yè)務(wù)數(shù)據(jù)的情況,
這時(shí)候我們需要對數(shù)據(jù)表進(jìn)行變動(dòng),
數(shù)據(jù)表發(fā)生變動(dòng)都通過SQL ALTER TABLE 語句來實(shí)現(xiàn)。
新增字段
-- 新增字段
-- ALTER TABLE `表名` ADD `列名稱` 字段類型(長度) [完整性約束條件] COMMENT '注釋說明' AFTER `位置字段`;
-- [完整性約束條件]指前文講的限定字段的條件,比如:
-- 為空設(shè)定:NOT NULL DEFAULT '0'
示例:
先看看test表現(xiàn)在有哪些字段
SQL
mysql> desc test;

補(bǔ)充兩個(gè)字段
SQL
mysql>ALTER TABLE `test` ADD `name` varchar(20) COMMENT '名稱';
Query OK, 0 rows affected (0.17 sec)
Records: 0?Duplicates: 0? Warnings: 0
SQL
mysql>desc test;

看到name字段已經(jīng)成功添加到test表當(dāng)中了
我們在添加一個(gè)字段,并且指定字段在name字段后面,
而且指定不能為空,默認(rèn)值為0
SQL
mysql>ALTER TABLE `test` ADD `gender` int(2) NOT NULL DEFAULT 0 COMMENT '性別 0未知 1女 2男' AFTER `name`;
Query OK, 0 rows affected (0.11 sec)
Records: 0?Duplicates: 0? Warnings: 0
看看現(xiàn)在有哪些字段了
SQL
mysql>desc test;

修改字段屬性
-- 修改字段屬性
-- ALTER TABLE `表名` CHANGE `列名稱``新列名稱`(不需要重命名就用和原來列名) 字段類型(長度) [完整性約束條件]
-- 注意,修改時(shí)如果不帶完整性約束條件,原有的約束條件將丟失,如果想保留修改時(shí)就得帶上完整性約束條件
示例:
我們先添加一個(gè)字段,在修改他的屬性
SQL
mysql> ALTER TABLE `test` ADD `brith` int(10) COMMENT '生日';
Query OK, 0 rows affected (0.12 sec)
Records: 0? Duplicates: 0? Warnings: 0
mysql> desc test;

看到brith字段已經(jīng)加進(jìn)去了
修改字段名稱
示例:
-- 修改字段名稱
-- ALTER TABLE `表名` CHANGE `列名稱` `新列名稱`(不需要重命名就用和原來列名) 字段類型(長度) [完整性約束條件]
-- 注意,修改時(shí)如果不帶完整性約束條件,原有的約束條件將丟失,如果想保留修改時(shí)就得帶上完整性約束條件
SQL
mysql> ALTER TABLE `test` CHANGE `brith` `brithday` int(10) COMMENT '生日';
Query OK, 0 rows affected (0.02 sec)
Records: 0? Duplicates: 0? Warnings: 0
mysql> desc test;

可以看到brith已經(jīng)改名為brithday
修改字段屬性
-- 修改字段屬性
-- ALTER TABLE `表名` MODIFY `列名稱` 字段類型(長度) [完整性約束條件]
-- 注意,修改時(shí)如果不帶完整性約束條件,原有的約束條件將丟失,如果想保留修改時(shí)就得帶上完整性約束條件
示例:
-- 修改brithday類型由數(shù)值改成字符串
SQL
mysql> ALTER TABLE `test` MODIFY `brithday` VARCHAR(20) COMMENT '生日';
Query OK, 1 row affected (0.08 sec)
Records: 1? Duplicates: 0? Warnings: 0
mysql> desc test;

可以看到brithday已經(jīng)由數(shù)值變成了一種文本格式
示例:
-- 將brithday移到name后面
SQL
mysql>ALTER TABLE `test` MODIFY `brithday` VARCHAR(20) COMMENT '生日' AFTER `name`;
Query OK, 0 rows affected (0.09 sec)
Records: 0?Duplicates: 0? Warnings: 0
mysql>DESC test;

可以看到成功講brithday移動(dòng)到了name后面
刪除一個(gè)字段列
刪除一個(gè)不再需要的字段使用DROP 語句,
在刪除數(shù)據(jù)列之前應(yīng)該確定業(yè)務(wù)當(dāng)中已經(jīng)不再使用這個(gè)字段,
當(dāng)前使用到的地方都已經(jīng)做了遷移,
否則…
-- 刪除列
-- ALTER TABLE `表名字` DROP `字段名稱`
示例:
此處先創(chuàng)建一個(gè)字段,
后然再將其刪除
SQL
mysql> ALTER TABLE `test` ADD `deleted` varchar(20) COMMENT '刪除演示字段';
Query OK, 0 rows affected (0.10 sec)
Records: 0? Duplicates: 0? Warnings: 0
mysql> desc test;

將其刪除
SQL
mysql>ALTER TABLE `test` DROP `deleted`;
Query OK, 0 rows affected (0.10 sec)
Records: 0?Duplicates: 0? Warnings: 0
mysql>desc test;

對字段值管理默認(rèn)值
添加默認(rèn)值
? 新建字段時(shí)指定默認(rèn)值
我們可以在一個(gè)字段創(chuàng)建時(shí)就可以進(jìn)行默認(rèn)值賦值
-- 新增字段
-- 前面講 ALTER TABLE `表名` ADD `字段名` 這個(gè)語法時(shí)講到約束條件里面是可以將默認(rèn)值之類進(jìn)行規(guī)定
演示:
SQL
mysql> ALTER TABLE `test` ADD `age` int(4) DEFAULT 18;
Query OK, 0 rows affected (0.14 sec)
Records: 0? Duplicates: 0? Warnings: 0
mysql> desc test;

設(shè)定age默認(rèn)值為18,之后所有數(shù)據(jù)在不賦予age時(shí)數(shù)據(jù)庫默認(rèn)會填入18
注:
新字段創(chuàng)建后,存量數(shù)據(jù)也會被賦予默認(rèn)值

? 修改已存在字段的默認(rèn)值
-- 已存在字段設(shè)置默認(rèn)值
-- ALTER TABLE `表名` ALTER `字段名` SET DEFAULT '默認(rèn)值';
演示:
SQL
mysql> ALTER TABLE `test` ALTER `name` SET DEFAULT '匿名用戶';
Query OK, 0 rows affected (0.01 sec)
Records: 0? Duplicates: 0? Warnings: 0
mysql> desc test;

注:
針對已存在的字段進(jìn)行默認(rèn)值賦予,
存量數(shù)據(jù)不受影響,不會被賦值,
新數(shù)據(jù)將會賦予默認(rèn)值。

刪除默認(rèn)值
使一個(gè)字段的默認(rèn)值失效,直接刪除即可。
-- 刪除默認(rèn)值
-- ALTER TABLE `表明` ALTER `字段名` DROP DEFAULT;
演示:
SQL
mysql> ALTER TABLE `test` ALTER `name` DROP DEFAULT;
Query OK, 0 rows affected (0.02 sec)
Records: 0? Duplicates: 0? Warnings: 0
mysql> desc test;

我們可以發(fā)現(xiàn)name的默認(rèn)值已經(jīng)不存在
數(shù)據(jù)表重命名
我先復(fù)制一張表出來,然后再演示刪除一張表。
演示:
SQL
mysql> CREATE TABLE `test1` SELECT * FROM `test`;
Query OK, 1 row affected (0.05 sec)
Records: 1? Duplicates: 0? Warnings: 0
mysql> show tables;

再對表進(jìn)行重命名
-- ALTER TABLE `表名字` RENAME `表新名字`
演示:
SQL
mysql>ALTER TABLE `test1` RENAME `test2`;
Query OK, 0 rows affected (0.02 sec)
mysql>show tables;

可以發(fā)現(xiàn)表已經(jīng)由test1改名為test2