数据表的修改与删除
6.10 综合示例:创建完整的表结构
-- 创建数据库
CREATE DATABASE IF NOT EXISTS 学校管理系统
CHARACTER SET utf8mb4;
USE 学校管理系统;
-- 学院表
CREATE TABLE 学院
(
学院编号 CHAR(2) PRIMARY KEY,
学院名称 VARCHAR(30) NOT NULL UNIQUE,
学院电话 CHAR(12),
学院地址 VARCHAR(100)
);
-- 教师表
CREATE TABLE 教师
(
教师编号 CHAR(10) PRIMARY KEY,
姓名 VARCHAR(20) NOT NULL,
性别 ENUM('男', '女'),
出生日期 DATE,
职称 VARCHAR(20),
学院编号 CHAR(2),
入职日期 DATE DEFAULT (CURRENT_DATE),
CONSTRAINT FK_教师_学院
FOREIGN KEY (学院编号) REFERENCES 学院(学院编号)
ON UPDATE CASCADE
);
-- 课程表
CREATE TABLE 课程
(
课程编号 CHAR(8) PRIMARY KEY,
课程名称 VARCHAR(50) NOT NULL,
学时数 INT CHECK (学时数 > 0 AND 学时数 <= 200),
学分数 DECIMAL(3,1) CHECK (学分数 > 0 AND 学分数 <= 10),
课程性质 VARCHAR(10) DEFAULT '必修',
课程介绍 TEXT
);
-- 学生表
CREATE TABLE 学生
(
学号 CHAR(10) PRIMARY KEY,
姓名 VARCHAR(20) NOT NULL,
性别 ENUM('男', '女'),
出生日期 DATE,
身份证号 CHAR(18) UNIQUE,
班级 VARCHAR(30),
学院编号 CHAR(2),
入学日期 DATE,
CONSTRAINT FK_学生_学院
FOREIGN KEY (学院编号) REFERENCES 学院(学院编号)
);
-- 选课成绩表
CREATE TABLE 选课成绩
(
学号 CHAR(10),
课程编号 CHAR(8),
成绩 DECIMAL(5,2) CHECK (成绩 >= 0 AND 成绩 <= 100),
选课日期 DATE DEFAULT (CURRENT_DATE),
CONSTRAINT PK_选课成绩 PRIMARY KEY (学号, 课程编号),
CONSTRAINT FK_选课_学生
FOREIGN KEY (学号) REFERENCES 学生(学号)
ON DELETE CASCADE,
CONSTRAINT FK_选课_课程
FOREIGN KEY (课程编号) REFERENCES 课程(课程编号)
);
6.11 数据表的修改
6.11.1 使用 USE 选择数据库
USE 学校管理系统;
6.11.2 查看表信息
-- 查看表结构
DESC 学生;
DESCRIBE 学生;
-- 查看建表语句
SHOW CREATE TABLE 学生;
-- 查看所有表
SHOW TABLES;
-- 查看表的索引
SHOW INDEX FROM 学生;
6.11.3 列的修改
添加新列
-- 添加单列(默认添加到最后)
ALTER TABLE 学生
ADD 手机号 CHAR(11);
-- 添加到指定位置
ALTER TABLE 学生
ADD 邮箱 VARCHAR(50) AFTER 姓名;
-- 添加到第一列
ALTER TABLE 学生
ADD 记录ID INT FIRST;
-- 同时添加多列
ALTER TABLE 学生
ADD (
QQ号 VARCHAR(15),
微信号 VARCHAR(30)
);
修改列的类型
-- 修改列的数据类型
ALTER TABLE 学生
MODIFY 手机号 VARCHAR(15);
-- 修改列的数据类型并设置约束
ALTER TABLE 学生
MODIFY 手机号 VARCHAR(15) NOT NULL;
修改列名
-- 修改列名(同时可以改类型)
ALTER TABLE 学生
CHANGE 手机号 联系电话 VARCHAR(15);
-- MySQL 8.0+ 可以只改列名
ALTER TABLE 学生
RENAME COLUMN 联系电话 TO 手机号;
删除列
-- 删除单列
ALTER TABLE 学生
DROP COLUMN QQ号;
-- 删除多列
ALTER TABLE 学生
DROP COLUMN 微信号,
DROP COLUMN 邮箱;
修改列的默认值
-- 设置默认值
ALTER TABLE 课程
ALTER COLUMN 课程性质 SET DEFAULT '选修';
-- 删除默认值
ALTER TABLE 课程
ALTER COLUMN 课程性质 DROP DEFAULT;
6.11.4 约束的修改
添加主键约束
-- 添加主键
ALTER TABLE 表名
ADD PRIMARY KEY (列名);
-- 添加命名的主键
ALTER TABLE 表名
ADD CONSTRAINT PK_表名 PRIMARY KEY (列名);
-- 添加复合主键
ALTER TABLE 表名
ADD PRIMARY KEY (列名1, 列名2);
删除主键约束
-- 如果主键是自增的,需要先去掉自增
ALTER TABLE 表名
MODIFY 列名 INT; -- 去掉 AUTO_INCREMENT
-- 删除主键
ALTER TABLE 表名
DROP PRIMARY KEY;
添加外键约束
ALTER TABLE 教师
ADD CONSTRAINT FK_教师_学院
FOREIGN KEY (学院编号) REFERENCES 学院(学院编号)
ON UPDATE CASCADE
ON DELETE SET NULL;
删除外键约束
-- 查看外键名称
SHOW CREATE TABLE 教师;
-- 删除外键(使用约束名)
ALTER TABLE 教师
DROP FOREIGN KEY FK_教师_学院;
-- 注意:删除外键后,索引可能还在,需要单独删除
ALTER TABLE 教师
DROP INDEX FK_教师_学院;
添加唯一约束
-- 添加唯一约束
ALTER TABLE 学生
ADD UNIQUE (身份证号);
-- 添加命名的唯一约束
ALTER TABLE 学生
ADD CONSTRAINT UK_学生_邮箱 UNIQUE (邮箱);
-- 添加复合唯一约束
ALTER TABLE 学生
ADD CONSTRAINT UK_班级姓名 UNIQUE (班级, 姓名);
删除唯一约束
-- 删除唯一约束(通过删除索引)
ALTER TABLE 学生
DROP INDEX UK_学生_邮箱;
添加检查约束
-- MySQL 8.0.16+
ALTER TABLE 学生
ADD CONSTRAINT CK_学生_年龄 CHECK (年龄 >= 0 AND 年龄 <= 150);
ALTER TABLE 成绩
ADD CHECK (成绩 BETWEEN 0 AND 100);
删除检查约束
ALTER TABLE 学生
DROP CHECK CK_学生_年龄;
-- 或者使用约束名
ALTER TABLE 表名
DROP CONSTRAINT 约束名;
添加/删除默认约束
-- 添加默认约束
ALTER TABLE 课程
ALTER 课程性质 SET DEFAULT '必修';
-- 删除默认约束
ALTER TABLE 课程
ALTER 课程性质 DROP DEFAULT;
6.11.5 修改表名
-- 方法1
RENAME TABLE 旧表名 TO 新表名;
-- 方法2
ALTER TABLE 旧表名 RENAME TO 新表名;
-- 批量重命名
RENAME TABLE
表1 TO 新表1,
表2 TO 新表2,
表3 TO 新表3;
6.11.6 查看约束信息
-- 查看表的所有约束
SELECT
CONSTRAINT_NAME,
CONSTRAINT_TYPE
FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = '学校管理系统'
AND TABLE_NAME = '学生';
-- 查看外键约束详情
SELECT
CONSTRAINT_NAME,
COLUMN_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = '学校管理系统'
AND TABLE_NAME = '教师'
AND REFERENCED_TABLE_NAME IS NOT NULL;
6.12 数据表的删除
6.12.1 删除单个表
DROP TABLE 课程;
6.12.2 安全删除
-- 存在才删除,避免报错
DROP TABLE IF EXISTS 课程;
6.12.3 删除多个表
DROP TABLE IF EXISTS 表1, 表2, 表3;
6.12.4 删除有外键关联的表
💡 删除顺序很重要:先删从表,再删主表
-- 正确的删除顺序
DROP TABLE IF EXISTS 选课成绩; -- 从表
DROP TABLE IF EXISTS 学生; -- 从表
DROP TABLE IF EXISTS 教师; -- 从表
DROP TABLE IF EXISTS 课程; -- 独立表
DROP TABLE IF EXISTS 学院; -- 主表
6.12.5 强制删除(禁用外键检查)
-- 临时禁用外键检查
SET FOREIGN_KEY_CHECKS = 0;
-- 删除表(不受外键约束限制)
DROP TABLE IF EXISTS 学院;
DROP TABLE IF EXISTS 学生;
-- 重新启用外键检查
SET FOREIGN_KEY_CHECKS = 1;
⚠️ 警告:禁用外键检查可能导致数据不一致,谨慎使用!
6.12.6 清空表数据(保留结构)
-- TRUNCATE:快速清空,重置自增值
TRUNCATE TABLE 学生;
-- DELETE:逐行删除,不重置自增值
DELETE FROM 学生;
TRUNCATE vs DELETE vs DROP:
| 操作 | 保留结构 | 保留数据 | 重置自增 | 可回滚 |
|---|---|---|---|---|
| DROP | ✗ | ✗ | - | ✗ |
| TRUNCATE | ✓ | ✗ | ✓ | ✗ |
| DELETE | ✓ | ✗ | ✗ | ✓ |
6.13 快速参考卡片
数据库操作
-- 创建
CREATE DATABASE 数据库名 CHARACTER SET utf8mb4;
-- 查看
SHOW DATABASES;
SHOW CREATE DATABASE 数据库名;
-- 使用
USE 数据库名;
-- 修改
ALTER DATABASE 数据库名 CHARACTER SET utf8mb4;
-- 删除
DROP DATABASE IF EXISTS 数据库名;
数据表操作
-- 创建
CREATE TABLE 表名 (
列名 类型 约束,
...
);
-- 查看
SHOW TABLES;
DESC 表名;
SHOW CREATE TABLE 表名;
-- 修改结构
ALTER TABLE 表名 ADD 列名 类型;
ALTER TABLE 表名 MODIFY 列名 新类型;
ALTER TABLE 表名 CHANGE 旧列名 新列名 类型;
ALTER TABLE 表名 DROP COLUMN 列名;
-- 删除
DROP TABLE IF EXISTS 表名;
TRUNCATE TABLE 表名;
约束速查表
| 约束类型 | 添加语法 | 删除语法 |
|---|---|---|
| PRIMARY KEY | ADD PRIMARY KEY (列) |
DROP PRIMARY KEY |
| FOREIGN KEY | ADD FOREIGN KEY (列) REFERENCES 表(列) |
DROP FOREIGN KEY 约束名 |
| UNIQUE | ADD UNIQUE (列) |
DROP INDEX 索引名 |
| CHECK | ADD CHECK (条件) |
DROP CHECK 约束名 |
| DEFAULT | ALTER 列 SET DEFAULT 值 |
ALTER 列 DROP DEFAULT |
| NOT NULL | MODIFY 列 类型 NOT NULL |
MODIFY 列 类型 NULL |
⬅️ 数据表的创建与完整性约束 🏠 00-数据库 ➡️ 数据的增删改
💬 评论