接續前幾篇資料表的教學,我們今天要來談談資料表操作的最後內容-修改表。通常在什麼樣的情況下,我們會要用到修改表呢?
在上一篇建立表教學文的留言區,不少板上的高手協助建議我們建表時應該要注意的部分。像是數質類可以統一用整數,字串類宜統一使用最大長度。再者資料型別bit現在預設只能存0與1,已修正原本第2篇資料型別教學文的內容。另外另外,還有大大私訊提到表內怎麼少了帳號密碼等等。
大大們建議歸建議,我們表都已經建下去了早就沒救了不是嗎?這個時候就得把修改表的指令請出來用用了,它就是為了我們建錯表或系統需求改變時而生的。修改表的主要指令為
ALTER TABLE `表名` 修改內容;
各位先參考參考。基於這個指令,我們將分三個小段落介紹。
- 加欄
- 砍欄
- 改欄
加欄
首先我們來處理漏掉使用者帳密欄位的問題,這得用到加欄的指令
ALTER TABLE `表名` ADD COLUMN `新欄位名稱` 新欄位約束;
如果我們要加很多欄,也可以這樣寫:
ALTER TABLE `表名` (
`新欄1名稱` 新欄1約束,
`新欄2名稱` 新欄2約束, ...);
照加欄語法寫,我們的範例語句可以是這樣:
ALTER TABLE `players` ADD COLUMN (
`username` VARCHAR(255) NOT NULL,
`password` VARCHAR(255) NOT NULL);
執行結果會是像下面這樣。
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 11
Server version: 10.4.12-MariaDB mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> USE `final_war`;
Database changed
MariaDB [final_war]> ALTER TABLE `players` ADD COLUMN (
-> `username` VARCHAR(255) NOT NULL,
-> `password` VARCHAR(255) NOT NULL);
Query OK, 0 rows affected (0.092 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [final_war]>
老樣子,只要看到「Query OK」就表示我們的指令執行成功!立馬用上次教的指令瞧瞧現在的資料表結構。
MariaDB [final_war]> SHOW CREATE TABLE `players`;
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| players | CREATE TABLE `players` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`weapon` varchar(10) NOT NULL,
`LV` bit(1) NOT NULL,
`HP` smallint(6) NOT NULL,
`SP` smallint(6) NOT NULL,
`ATK` smallint(6) NOT NULL,
`DEF` smallint(6) NOT NULL,
`SPD` smallint(6) NOT NULL,
`username` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.039 sec)
MariaDB [final_war]>
砍欄
眾多大大的回應中沒有跟砍欄有關的內容,小弟自己來唬爛一下。假使我們的game開發起來發現性質上是個即時戰略遊戲,不需要速度這個回合制才需要的特性。
上面這個故事,意謂著我們的「SPD」欄已不會再用到可砍掉。砍欄的指令為
ALTER TABLE `表名` DROP COLUMN `要砍的欄位名稱`;
也就是說我們的參考語句可能會是這樣:
ALTER TABLE `players` DROP COLUMN `SPD`;
執行結果會像下面這樣。
MariaDB [final_war]> ALTER TABLE `players` DROP COLUMN `SPD`;
Query OK, 0 rows affected (0.112 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [final_war]>
趕快來看看是不是真的砍掉了。
MariaDB [final_war]> SHOW CREATE TABLE `players`;
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| players | CREATE TABLE `players` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`weapon` varchar(10) NOT NULL,
`LV` bit(1) NOT NULL,
`HP` smallint(6) NOT NULL,
`SP` smallint(6) NOT NULL,
`ATK` smallint(6) NOT NULL,
`DEF` smallint(6) NOT NULL,
`username` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.029 sec)
MariaDB [final_war]>
改欄
在上一篇教學的留言區中,Maxe大大建議我們數值類資料可以一律用int且varchar也可以統一開到極限長度255。這樣一來我們開發系統時就不會還要注意資料大小、長度是不是存得進去了,研發力氣會省不少。另外阿慶大大提到資料型別bit現在預設只能存0跟1,這麼小的空間不夠我們存玩家等級啊!看來我們也得統一用一下int資料型別才行。
要做到這些我們得用上改欄的指令,有兩個參考語句可以讓我們選用。
語句一:
ALTER TABLE `表名` MODIFY `要改的欄位名稱` 本欄的新約束;
語句二:
ALTER TABLE `表名` CHANGE `要修改的欄位名稱` `本欄位的新名稱` 本欄位的新約束;
一般常用的指令為MODIFY,除非我們有連欄位名稱都要重新命名一下才用CHANGE。小弟這邊會把它們的執行範例都show給各位看。
MODIFY
照上面的改欄語法及我們現在的需求,執行結果大概會像下面這樣。
MariaDB [final_war]> ALTER TABLE `players` MODIFY `name` VARCHAR(255) NOT NULL;
Query OK, 0 rows affected (0.019 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [final_war]> ALTER TABLE `players` MODIFY `weapon` VARCHAR(255) NOT NULL;
Query OK, 0 rows affected (0.032 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [final_war]> ALTER TABLE `players` MODIFY `LV` INT NOT NULL;
Query OK, 0 rows affected (0.172 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [final_war]> ALTER TABLE `players` MODIFY `HP` INT NOT NULL;
Query OK, 0 rows affected (0.138 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [final_war]> ALTER TABLE `players` MODIFY `SP` INT NOT NULL;
Query OK, 0 rows affected (0.107 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [final_war]> ALTER TABLE `players` MODIFY `ATK` INT NOT NULL;
Query OK, 0 rows affected (0.179 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [final_war]> ALTER TABLE `players` MODIFY `DEF` INT NOT NULL;
Query OK, 0 rows affected (0.112 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [final_war]>
CHANGE
繼續演示執行結果前,小弟得先跟各位做最後的淲爛。剛剛我們不是為了帳號密碼多弄了「username」跟「password」兩個新欄出來嗎?小弟建了發現這樣不行,我們很容易把它跟name欄搞混。
為了避免這種狀況,我們把username欄的名稱改成email好了。別忘了,我們也要把它的varchar資料型別設定成最大長度255。執行結果會像下面這樣。
MariaDB [final_war]> ALTER TABLE `players` CHANGE `username` `email` VARCHAR(255) NOT NULL;
Query OK, 0 rows affected (0.026 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [final_war]>
終於都改好了,牛逼!我們趕緊來欣賞欣賞剛弄好的作品。
MariaDB [final_war]> SHOW CREATE TABLE `players`;
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| players | CREATE TABLE `players` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`weapon` varchar(255) NOT NULL,
`LV` int(11) NOT NULL,
`HP` int(11) NOT NULL,
`SP` int(11) NOT NULL,
`ATK` int(11) NOT NULL,
`DEF` int(11) NOT NULL,
`email` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.008 sec)
MariaDB [final_war]>
表內容終結
到這邊,我們終於把表的基本操作全都說完了。由於表是資料庫系統中非常重要的一個物件,我們開發系統時常要跟表打交道且它的操作又稍嫌複雜。會追小弟系列文的大大若您對資料庫系統真的很有興趣,這個地方您可千萬要練習練習。可以自己亂建個表再亂砍亂改一下表都行。
那麼從下一篇教學起,我們將正式進入資料的增刪改查。那個部分也是相當相當重要,不過它就沒有表操作那麼困難了。詳細的內容究竟如何,我們就留到下篇教學發布時再跟各位細說。
※最後更新時間:2021-10-30 18:47:50 From:219.70.166.106 By:Dack
※最後更新時間:2021-10-30 18:51:56 From:219.70.166.106 By:Dack
※最後更新時間:2021-11-02 13:24:19 From:163.13.224.224 By:Dack