Skip to content

表(创建 / 修改 / 重命名 / 删除 / 清空)

创建表

基本语法

sql
CREATE TABLE student (
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    age INT,
    score DECIMAL(5,2)
);

完整示例

sql
CREATE TABLE student (
    id           BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
    name         VARCHAR(50) NOT NULL COMMENT '姓名',
    age          INT COMMENT '年龄',
    gender       CHAR(1) COMMENT '性别 M/F',
    class_id     INT COMMENT '班级编号',
    score        DECIMAL(5,2) COMMENT '成绩',
    created_at   DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at    TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生表';

通过查询结果创建表

sql
-- 把查询结果直接变成一张新表
CREATE TABLE top_students AS
SELECT * FROM student WHERE score >= 90;

用这种方式创建的表没有主键和索引,需要手动补充。

IF NOT EXISTS

sql
CREATE TABLE IF NOT EXISTS student (
    ...
);

查看表结构

sql
-- 查看表结构(描述)
DESC student;
DESCRIBE student;

-- 查看建表语句
SHOW CREATE TABLE student;

-- 查看所有列信息
SHOW COLUMNS FROM student;
SHOW COLUMNS FROM student LIKE '%name%';

修改表结构(ALTER TABLE)

添加列

sql
-- 在末尾添加列
ALTER TABLE student ADD COLUMN email VARCHAR(100);

-- 在指定位置添加列
ALTER TABLE student ADD COLUMN phone VARCHAR(20) AFTER name;

-- 在最前面添加列
ALTER TABLE student ADD COLUMN new_id INT FIRST;

修改列

sql
-- 修改列定义(可以改类型、大小、默认值)
ALTER TABLE student MODIFY COLUMN score DECIMAL(6,2);

-- 修改列名和定义
ALTER TABLE student CHANGE COLUMN score score_new DECIMAL(6,2);

删除列

sql
ALTER TABLE student DROP COLUMN email;

删除列前请确认没有外键引用该列。

添加约束

sql
-- 添加主键
ALTER TABLE student ADD PRIMARY KEY (id);

-- 添加唯一约束
ALTER TABLE student ADD UNIQUE (name);

-- 添加外键
ALTER TABLE student ADD FOREIGN KEY (class_id) REFERENCES class(id);

添加索引

sql
ALTER TABLE student ADD INDEX idx_name (name);
ALTER TABLE student ADD FULLTEXT INDEX idx_intro (intro);

重命名表

sql
-- 方式一
RENAME TABLE student TO stu;

-- 方式二
ALTER TABLE student RENAME TO stu;

-- 批量重命名
RENAME TABLE student TO stu1, teacher TO tea1;

跨数据库重命名

sql
RENAME TABLE school.student TO new_school.student;

删除表

sql
DROP TABLE student;

危险操作! 删除后数据无法恢复。

sql
-- IF EXISTS 防止报错
DROP TABLE IF EXISTS student;

-- 同时删除多个表
DROP TABLE student, teacher, class;

清空表

TRUNCATE(DDL,快,推荐)

sql
TRUNCATE TABLE student;

特点:

  • 删除并重建表,速度极快(不记录每行删除)
  • 重置 AUTO_INCREMENT 为初始值
  • 不能回滚(因为是 DDL,不是 DML)
  • 不触发 DELETE 触发器

适用场景:快速清空测试数据、不需要保留事务日志。

DELETE(可以回滚)

sql
DELETE FROM student;

特点:

  • 逐行删除,记录每行操作
  • 可加 WHERE 条件删除部分数据
  • 可回滚(在事务中)
  • 不重置 AUTO_INCREMENT

适用场景:需要回滚、需要条件删除、需要触发器执行。

对比

特性TRUNCATEDELETE
类型DDLDML
速度极快
WHERE 条件❌ 不支持✅ 支持
回滚❌ 不可以✅ 可以
重置自增✅ 重置❌ 不重置
触发器❌ 不触发✅ 触发
释放空间✅ 释放❌ 不立即释放

复制表结构

sql
-- 只复制结构
CREATE TABLE student_copy LIKE student;

-- 复制结构和数据
CREATE TABLE student_copy AS SELECT * FROM student;

-- 只复制部分列
CREATE TABLE student_copy AS
SELECT name, score FROM student WHERE score >= 60;

临时表

临时表只在当前会话中可见,会话结束后自动删除:

sql
-- 临时表:会话结束后自动消失
CREATE TEMPORARY TABLE temp_data (
    id INT,
    value VARCHAR(50)
);

-- 或基于查询创建
CREATE TEMPORARY TABLE temp_summary AS
SELECT class_id, AVG(score) AS avg_score
FROM student GROUP BY class_id;

表重命名注意事项

重命名表时,如果表有外键引用,需要注意:

  • 外键约束名称必须唯一
  • 视图引用不受影响
  • 触发器引用不受影响

下一步

建表和管理学完了,接下来学习 阿里命名规范 / MySQL8 DDL 原子化

基于 VitePress 构建