承接上篇,本文匯總 MySQL 5.x/8.x 通用的 DDL、DML、索引、權限、備份核心命令與實戰示例,作為日常運維開發的速查手冊。
-- 增加欄位
ALTER TABLE student ADD saddress VARCHAR(25);
-- 修改欄位名+類型(即使類型不變也必須指定類型)
ALTER TABLE student CHANGE saddress sremark TEXT;
-- 僅修改類型
ALTER TABLE student MODIFY sremark VARCHAR(25);
-- 刪除欄位
ALTER TABLE student DROP sremark;
-- 重命名表
ALTER TABLE student RENAME TO employee;
注意: 大表 ALTER TABLE 會鎖表重建(MySQL 5.6+ 支援 Online DDL 部份操作),高併發環境請用 pt-online-schema-change 或 gh-ost 非阻塞變更。
INSERT INTO student(sno, sname, ssex, sbirthday, sdepa)
VALUES ('0321001', 'Delux', DEFAULT, '1983-12-11', 'math');
-- 批量插入(單語句多 VALUES,效率遠高於多條 INSERT)
INSERT INTO student(sno, sname) VALUES
('001', 'A'), ('002', 'B'), ('003', 'C');
DELETE FROM student WHERE sno='0321001'; -- 按條件刪除
DELETE FROM student WHERE LEFT(sno,4)='0321'; -- 模糊條件刪除
DELETE FROM student; -- 逐行刪全表(慢、產生大量 Binlog)
TRUNCATE TABLE student; -- 截斷表:DROP+重建,極快、不觸發 Trigger、自增歸零
UPDATE student SET sbirthday='1984-10-10' WHERE sno='9810141';
-- 返回:Rows matched: 1 Changed: 1 Warnings: 0
CREATE TABLE course (
cno VARCHAR(5) NOT NULL,
cname VARCHAR(30) NOT NULL,
teacher VARCHAR(20),
PRIMARY KEY (cno),
INDEX cna (cname) -- 普通索引
-- UNIQUE (cname) -- 唯一索引,禁止重複值
);
CREATE INDEX sna ON student(sname);
CREATE UNIQUE INDEX uq_email ON users(email);
-- 字符/文本列可指定前綴長度
CREATE INDEX idx_content_prefix ON articles(content(100));
-- BLOB/TEXT 列**必須**指定前綴長度
DROP INDEX sna ON student;
DROP INDEX uq_email ON users;
| 表 | 層級 | 核心職責 |
|---|---|---|
user | 全局 | 帳號、密碼、主機、全局權限 |
db | 數據庫 | 哪個帳號能訪問哪個庫、庫級權限 |
host | 主機 | 配合 db.Host='%' 細粒度控制主機訪問 |
tables_priv | 表 | 表級權限 |
columns_priv | 列 | 列級權限 |
SELECT, INSERT, UPDATE, DELETECREATE, DROP, ALTER, INDEXRELOAD, SHUTDOWN, PROCESS, FILE, SUPER, REPLICATION SLAVE/CLIENTGRANT OPTION-- 授權(推薦显式列出權限,避免 ALL PRIVILEGES)
GRANT SELECT, INSERT, UPDATE ON db_name.* TO 'user'@'host' IDENTIFIED BY 'pass' WITH GRANT OPTION;
-- 列級授權
GRANT SELECT (id, name), UPDATE (name) ON db.tbl TO 'user'@'host';
-- 回收權限
REVOKE INSERT ON db_name.* FROM 'user'@'host';
-- 修改密碼(兩種方式)
SET PASSWORD FOR 'user'@'host' = PASSWORD('newpass'); -- 無需 FLUSH PRIVILEGES
UPDATE mysql.user SET authentication_string=PASSWORD('newpass') WHERE User='user' AND Host='host';
FLUSH PRIVILEGES;
# 全庫備份(含結構+數據)
mysqldump -u root -p --single-transaction --routines --triggers --events --databases db1 db2 > backup.sql
# 僅結構
mysqldump -u root -p -d db_name > schema.sql
# 僅數據
mysqldump -u root -p -t db_name > data.sql
# 指定表
mysqldump -u root -p db_name tbl1 tbl2 > tables.sql
# 壓縮輸出
mysqldump -u root -p db_name | gzip > backup.sql.gz
mysql -u root -p db_name < backup.sql
# 或進入 mysql 客戶端
SOURCE /path/backup.sql;
FLUSH TABLES WITH READ LOCK 秒級)。DELETE FROM table 不重置自增 ID,TRUNCATE 會歸零。CHANGE 必須指定類型,MODIFY 僅改類型。FLUSH PRIVILEGES(MySQL 8.0+ 自動生效),但直接操作 mysql.* 表後必須執行。mysql -u root -p test_db < backup.sql 定期演練恢復,未測試的備份 = 無備份。掌握這套「DDL/DML/索引/權限/備份」核心命令集,覆蓋 90% 日常運維開發場景。關鍵在於:**大表變更用在線工具、刪數據用 TRUNCATE、權限最小化授予、備份必演練恢復**。將命令內化為肌肉記憶,配合版本差異(5.7 vs 8.0 權限系統、認證插件變化)查閱官方文檔,方能游刃有餘。