[討論] 東區幻境MariaDB系列教學07-修改表 - 討論區

[討論] 東區幻境MariaDB系列教學07-修改表

文章瀏覽次數 60 文章回覆數 2

Dack

Dack圖像(預設)

2021-10-30 18:40:20

From:219.70.166.106

接續前幾篇資料表的教學,我們今天要來談談資料表操作的最後內容-修改表。通常在什麼樣的情況下,我們會要用到修改表呢?
在上一篇建立表教學文的留言區,不少板上的高手協助建議我們建表時應該要注意的部分。像是數質類可以統一用整數,字串類宜統一使用最大長度。再者資料型別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

留言

#1

特種兵

特種兵圖像(預設)

2021-11-02 10:47:15

From:211.23.21.202

再來抓錯字:
Max 應該是 Maxe
淲爛 應該也是打錯字
補充,如果是要當作 index 的最好不要設成 varchar(255) 這樣 index 就沒意義了,有些版本也可能會失敗,有限制大小。

#2

Dack

Dack圖像(預設)

2021-11-02 13:24:58

From:163.13.224.224

已修正,Maxe大大抱歉抱歉