資料表是資料庫儲存資料的基本單位,由欄位與記錄組成。本章系統講解 CREATE TABLE、ALTER TABLE、DROP TABLE 核心語法與實戰技巧。
先執行 USE db_name; 選擇資料庫,再使用 CREATE TABLE:
CREATE TABLE 表名 (
欄位名 資料類型 [完整性約束],
...
);
| 約束 | 關鍵字 | 說明 |
|---|---|---|
| 主鍵 | PRIMARY KEY | 唯一標識每行,非空、唯一 |
| 外鍵 | FOREIGN KEY | 關聯父表主鍵,維護參考完整性 |
| 非空 | NOT NULL | 欄位值不能為 NULL |
| 唯一 | UNIQUE | 欄位值不可重複 |
| 自增 | AUTO_INCREMENT | 整數型主鍵自動遞增 |
| 預設值 | DEFAULT | 插入時未指定則用預設值 |
CREATE TABLE student (
stu_id INT PRIMARY KEY,
name VARCHAR(20)
);
CREATE TABLE score (
stu_id INT,
course_id INT,
score DECIMAL(5,2),
PRIMARY KEY (stu_id, course_id)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
cust_id INT,
FOREIGN KEY (cust_id) REFERENCES customers(cust_id)
);
注意:子表外鍵必須關聯父表主鍵,資料類型需一致;父表刪除記錄時,子表對應行需級聯處理(ON DELETE CASCADE/SET NULL)。
-- 非空
email VARCHAR(50) NOT NULL
-- 唯一
id_card CHAR(18) UNIQUE
-- 自增(需為主鍵一部分)
id INT AUTO_INCREMENT PRIMARY KEY
-- 預設值
status TINYINT DEFAULT 1
reg_date DATETIME DEFAULT CURRENT_TIMESTAMP
| 指令 | 輸出內容 |
|---|---|
| DESCRIBE 表名; 或 DESC 表名; | 欄位名、類型、是否主鍵/外鍵、預設值、Extra |
| SHOW CREATE TABLE 表名\G | 完整建表 SQL、儲存引擎、字元集 |
使用 ALTER TABLE,支援以下操作:
ALTER TABLE old_name RENAME [TO] new_name;
ALTER TABLE 表名 CHANGE 舊欄位名 新欄位名 新資料類型;
-- 僅改名時資料類型保持原樣
ALTER TABLE 表名 MODIFY 欄位名 新資料類型;
ALTER TABLE 表名 ADD 欄位名 資料類型 [約束] [FIRST | AFTER 既有欄位名];
-- FIRST:插到第一欄
-- AFTER col:插在 col 之後
-- 無位置參數則預設加在最後
ALTER TABLE 表名 DROP 欄位名;
ALTER TABLE 表名 MODIFY 欄位名 資料類型 FIRST | AFTER 既有欄位名;
ALTER TABLE 表名 ENGINE = InnoDB; -- 或 MyISAM 等
-- 警告:大量資料表變更引擎會重建表,鎖表時間長,謹慎操作!
ALTER TABLE 子表名 DROP FOREIGN KEY 外鍵別名;
-- 外鍵別名為建立時指定的 CONSTRAINT 名稱
DROP TABLE 表名;
直接 DROP 會報錯(外鍵約束阻擋)。兩種解法:
ALTER TABLE child DROP FOREIGN KEY fk_name;,再刪父表最佳實踐:
1. 欄位命名採用 snake_case,見名知意
2. 每張表必有單欄自增主鍵(業務主鍵另建唯一索引)
3. 外鍵在高併發系統常改由應用層維護,資料庫層面不建外鍵
4. 修改線上表結構請用pt-online-schema-change等工具避免鎖表
5. 變更前必須備份,變更後驗證資料完整性