库与表的 DDL
约 779 字大约 3 分钟
布欧-Lewyon
2026-05-15
首页 › MySQL › DDL 与 DML(在新窗口打开) › 库与表的 DDL
DDL(Data Definition Language)用于定义和修改数据库与表的结构。前面已接触过基础的 CREATE / DROP,本节系统梳理 ALTER、列操作、索引管理和存储引擎设置。
回顾:数据库级别的 DDL
-- 创建
CREATE DATABASE IF NOT EXISTS blog DEFAULT CHARACTER SET utf8mb4;
-- 修改字符集
ALTER DATABASE blog CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 删除
DROP DATABASE IF EXISTS blog;表级别的 CREATE 完整语法
CREATE TABLE [IF NOT EXISTS] user (
id INT UNSIGNED AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL,
email VARCHAR(100) UNIQUE,
age TINYINT UNSIGNED DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
INDEX idx_username (username),
INDEX idx_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;ALTER TABLE 修改表结构
添加字段
-- 默认追加到最后
ALTER TABLE user ADD COLUMN phone VARCHAR(20);
-- 指定位置
ALTER TABLE user ADD COLUMN nickname VARCHAR(50) AFTER username;
ALTER TABLE user ADD COLUMN id_card CHAR(18) FIRST; -- 放在第一列修改字段
-- 修改数据类型
ALTER TABLE user MODIFY COLUMN phone VARCHAR(15) NOT NULL;
-- 重命名字段同时改类型(CHANGE 需提供新旧两个名字)
ALTER TABLE user CHANGE COLUMN phone mobile VARCHAR(15);
-- 修改默认值
ALTER TABLE user ALTER COLUMN age SET DEFAULT 18;
-- 删除默认值
ALTER TABLE user ALTER COLUMN age DROP DEFAULT;删除字段
ALTER TABLE user DROP COLUMN mobile;注意:删除字段会永久丢失该列的全部数据,不可回滚。
重命名表
ALTER TABLE user RENAME TO account;
RENAME TABLE account TO user; -- 另一种写法
-- 批量重命名/跨库移动
RENAME TABLE user TO backup.user_2025, orders TO backup.orders_2025;索引管理(DDL 范畴)
-- 添加索引
CREATE INDEX idx_email ON user(email); -- 普通索引
CREATE UNIQUE INDEX idx_username ON user(username); -- 唯一索引
ALTER TABLE user ADD INDEX idx_age (age); -- 另一种语法
-- 删除索引
DROP INDEX idx_email ON user;
ALTER TABLE user DROP INDEX idx_age;
-- 查看索引
SHOW INDEX FROM user;存储引擎
-- 建表时指定
CREATE TABLE log (
id INT AUTO_INCREMENT PRIMARY KEY,
message TEXT,
created_at DATETIME
) ENGINE=InnoDB;
-- 修改已存在表的引擎
ALTER TABLE log ENGINE=MyISAM;
-- 查看表使用的引擎
SHOW TABLE STATUS WHERE Name = 'log';常用引擎对比
| 引擎 | 事务 | 行锁 | 外键 | 场景 |
|---|---|---|---|---|
| InnoDB(默认) | ✅ | ✅ | ✅ | 大多数 OLTP 场景 |
| MyISAM | ❌ | ❌(表锁) | ❌ | 只读/报表/日志(已逐步淘汰) |
| Memory | ❌ | ❌(表锁) | ❌ | 临时表/缓存,重启数据丢失 |
| CSV | ❌ | ❌ | ❌ | 数据交换,可被 Excel 直接读取 |
MySQL 8.0 起,系统表仅支持 InnoDB;MyISAM 虽仍可用但不推荐新项目使用。
DDL 与事务的关系
DDL 语句在 MySQL 中是隐式提交——执行 DDL 前会自动提交当前事务,且 DDL 本身无法回滚:
START TRANSACTION;
INSERT INTO user (username) VALUES ('test');
CREATE TABLE temp (id INT); -- 自动提交了前面的 INSERT
ROLLBACK; -- 只回滚到 CREATE 之后,INSERT 已被提交小结
- DDL 管理数据库和表的结构:
CREATE/ALTER/DROP/RENAME。 ALTER TABLE可添加、修改、删除列和索引;CHANGE可重命名字段。- InnoDB 是默认且推荐的生产级存储引擎,支持事务与行锁。
- DDL 隐式提交事务,生产环境中执行
DROP/ALTER前应确认影响。
上一节:约束 下一节:数据操作(INSERT / UPDATE / DELETE)
