MySQL(二) - 数据表管理
文章目录
- 一、MySQL数据类型
- 1. 数字类型
- 2. 字符串类型
- 3. 时间日期类型
- 4. 二进制类型
- 5. 枚举类型 (ENUM)
- 6. SET类型
- 7. 使用建议
- 二、约束条件
- 1. 主键约束 (PRIMARY KEY)
- 2. 非空约束 (NOT NULL)
- 3. 唯一约束 (UNIQUE)
- 4. 外键约束 (FOREIGN KEY)
- 5. 检查约束 (CHECK)
- 6. 默认约束 (DEFAULT)
- 7. 约束对比
- 三、数据表基本操作
- 1. 创建数据表
- 1.1 创建数据表语法及解释
- 1.2 语法使用要点总结
- 1.3 创建数据表示例
- 1.3.1 创建带有所有约束条件及表选项的数据表
- 1.3.2 创建学生课程及其关系表
- 2. 查看数据表
- 2.1 查看数据库中的所有数据表
- 2.2 查看数据表的创建语句
- 2.3 查看数据表的结构(字段信息)
- 2.4 使用 `SHOW COLUMNS` 查看更详细信息
- 2.5 查看表的状态信息
- 3. 修改数据表
- 3.1 重命名表名
- 3.1.1 语法
- 3.1.2 示例
- 3.2 添加字段和约束
- 3.2.1 语法
- 3.2.2 示例
- 3.3 重命名列名
- 3.3.1 语法
- 3.3.2 示例
- 3.4 修改列定义
- 3.4.1 语法
- 3.4.2 示例
- 3.5 删除字段和约束
- 3.5.1 语法
- 3.5.2 示例
- 4. 删除数据表
- 4.1 删除数据表语法
- 4.2 示例
一、MySQL数据类型
在进行MySQL数据表设计时,选择合适的数据类型是至关重要的第一步。正确的数据类型不仅能保证数据的完整性和准确性,还能有效提升数据库的存储效率和查询性能。MySQL提供了丰富的数据类型,主要可以分为数字类型、字符串类型、时间日期类型、二进制类型、枚举类型和SET类型。下面我们通过表格形式逐一介绍。
1. 数字类型
类型 | 存储空间 | 有符号范围 | 无符号范围 | 说明 |
---|---|---|---|---|
TINYINT | 1 字节 | -128 到 127 | 0 到 255 | 最小整数类型,适合状态标志位(如:0/1) |
SMALLINT | 2 字节 | -32,768 到 32,767 | 0 到 65,535 | 小范围整数 |
MEDIUMINT | 3 字节 | -8,388,608 到 8,388,607 | 0 到 16,777,215 | 中等范围整数 |
INT / INTEGER | 4 字节 | -2,147,483,648 到 2,147,483,647 | 0 到 4,294,967,295 | 最常用的标准整数类型 |
BIGINT | 8 字节 | -2⁶³ 到 2⁶³-1 | 0 到 2⁶⁴-1 | 超大整数,如用户ID、订单号等 |
FLOAT(M,D) | 4 字节 | 单精度浮点数 | 单精度浮点数 | 近似值,不适用于精确计算(如金额) |
DOUBLE(M,D) | 8 字节 | 双精度浮点数 | 双精度浮点数 | 比 FLOAT 更高精度,仍为近似值 |
DECIMAL(M,D) / NUMERIC(M,D) | 可变 | 精确数值 | 精确数值 | 用于货币、财务等需要精确计算的场景 |
说明:
M
表示总位数(精度),D
表示小数位数(标度)。UNSIGNED
属性可应用于整数和浮点类型,表示只允许非负数,扩大正数范围。
2. 字符串类型
类型 | 存储空间 | 最大长度 | 说明 |
---|---|---|---|
CHAR(N) | 固定 N 字节 | 255 字符 | 定长字符串,不足部分用空格填充,适合固定长度字段(如性别、邮编) |
VARCHAR(N) | 实际长度 + 1~2 字节 | 65,535 字节(受行大小限制) | 变长字符串,节省空间,推荐用于大多数文本字段 |
TINYTEXT | 实际长度 + 1 字节 | 255 字节 | 短文本,不支持全文索引 |
TEXT | 实际长度 + 2 字节 | 65,535 字节 (~64KB) | 常用文本类型,如文章摘要 |
MEDIUMTEXT | 实际长度 + 3 字节 | 16,777,215 字节 (~16MB) | 中等长度文本 |
LONGTEXT | 实际长度 + 4 字节 | 4,294,967,295 字节 (~4GB) | 超长文本,如日志、小说内容 |
ENUM('v1','v2',...) | 1 或 2 字节 | 最多 65,535 个成员 | 枚举,只能选一个预定义值,内部以数字存储,高效 |
SET('v1','v2',...) | 1~8 字节 | 最多 64 个成员 | 集合,可选多个预定义值,以逗号分隔存储 |
3. 时间日期类型
类型 | 格式 | 范围 | 存储空间 | 说明 |
---|---|---|---|---|
DATE | YYYY-MM-DD | '1000-01-01' 到 '9999-12-31' | 3 字节 | 仅日期 |
TIME | HH:MM:SS[.fraction] | '-838:59:59' 到 '838:59:59' | 3 字节(不含微秒) | 仅时间,可表示时间间隔 |
DATETIME | YYYY-MM-DD HH:MM:SS[.fraction] | '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59' | 5 字节(不含微秒) | 日期和时间,与时区无关 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS[.fraction] | '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC | 4 字节(不含微秒) | 自动转换为UTC存储,受时区影响 |
YEAR | YYYY | 1901 到 2155 | 1 字节 | 年份,通常用4位格式 |
4. 二进制类型
类型 | 存储空间 | 最大长度 | 说明 |
---|---|---|---|
BINARY(N) | 固定 N 字节 | 255 字节 | 定长二进制数据,用 \0 填充 |
VARBINARY(N) | 实际长度 + 1~2 字节 | 65,535 字节 | 变长二进制数据 |
TINYBLOB | 实际长度 + 1 字节 | 255 字节 | 小型二进制对象 |
BLOB | 实际长度 + 2 字节 | 65,535 字节 (~64KB) | 通用二进制大对象 |
MEDIUMBLOB | 实际长度 + 3 字节 | 16,777,215 字节 (~16MB) | 中型二进制对象 |
LONGBLOB | 实际长度 + 4 字节 | 4,294,967,295 字节 (~4GB) | 大型二进制对象,如图片、音频、视频 |
注意:
BLOB
类型与TEXT
类型类似,也受单行最大65,535字节的限制(实际可用空间更小,因包含其他字段和开销)。
5. 枚举类型 (ENUM)
特性 | 说明 |
---|---|
语法 | ENUM('value1', 'value2', ..., 'valueN') |
取值 | 只能从预定义列表中选择一个值 |
存储 | 内部以数字(1~65535)存储,非常节省空间 |
优点 | 数据约束强,防止无效值;存储效率高 |
缺点 | 添加新值需修改表结构;排序按内部索引而非字母顺序 |
适用场景 | 状态字段(如:status ENUM('active','inactive','deleted') ) |
6. SET类型
特性 | 说明 |
---|---|
语法 | SET('value1', 'value2', ..., 'valueN') |
取值 | 可从预定义列表中选择零个或多个值(如 'val1,val3' ) |
存储 | 内部以位图(bit field)存储,效率高 |
最大成员数 | 最多 64 个 |
优点 | 可存储多个选项,空间利用率高 |
适用场景 | 用户兴趣、权限组合(如 hobbies SET('reading','music','sports') ) |
7. 使用建议
- 整数:优先使用
INT
,根据范围选择TINYINT
或BIGINT
。 - 字符串:优先使用
VARCHAR
,避免滥用TEXT
。 - 精确数值:必须使用
DECIMAL
,避免用FLOAT
/DOUBLE
存储金额。 - 日期时间:一般使用
DATETIME
,需要自动时区转换时用TIMESTAMP
。 - 状态/选项:考虑
ENUM
或SET
以提高效率和数据完整性。
二、约束条件
在MySQL中,约束(Constraints) 是用于保证数据库数据完整性、一致性和准确性的规则。通过在数据表上定义约束,可以防止无效或不一致的数据被插入或更新。合理使用约束是数据库设计的重要组成部分。MySQL支持多种类型的约束,主要包括:主键约束、非空约束、唯一约束、外键约束、检查约束和默认约束。
1. 主键约束 (PRIMARY KEY)
主键约束用于唯一标识数据表中的每一行记录。一个表只能有一个主键,主键列的值必须非空(NOT NULL)且唯一(UNIQUE)。
特性 | 说明 |
---|---|
关键字 | PRIMARY KEY |
唯一性 | ✅ 强制要求所有值唯一,不允许重复 |
非空性 | ✅ 自动隐含 NOT NULL 约束,不允许 NULL 值 |
数量限制 | 一个表只能定义一个主键(但主键可以由多个列组成,称为复合主键) |
索引 | MySQL会自动为主键创建唯一索引(PRIMARY 索引),提高查询效率 |
示例 | id INT PRIMARY KEY AUTO_INCREMENT 或 PRIMARY KEY (col1, col2) (复合主键) |
2. 非空约束 (NOT NULL)
非空约束确保某列不能存储 NULL
值,即该列必须有值。
特性 | 说明 |
---|---|
关键字 | NOT NULL |
作用 | 强制该列必须包含一个具体的值,不能为 NULL |
灵活性 | 可以与其他约束(如 UNIQUE 、DEFAULT )组合使用 |
示例 | name VARCHAR(50) NOT NULL email VARCHAR(100) NOT NULL |
注意 | 如果未设置默认值且没有提供数据,插入时会报错 |
3. 唯一约束 (UNIQUE)
唯一约束确保某列(或列组合)中的所有值都是唯一的,但允许存在 NULL
值(NULL
被视为“未知”,多个 NULL
不违反唯一性)。
特性 | 说明 |
---|---|
关键字 | UNIQUE 或 UNIQUE KEY |
唯一性 | ✅ 要求所有非 NULL 值唯一 |
非空性 | ❌ 不强制非空,允许 NULL (但最多一个 NULL 在某些旧版本中可能受限) |
数量限制 | 一个表可以有多个唯一约束 |
索引 | MySQL会自动为 UNIQUE 列创建唯一索引 |
示例 | email VARCHAR(100) UNIQUE UNIQUE (username, phone) (联合唯一) |
4. 外键约束 (FOREIGN KEY)
外键约束用于建立两个表之间的链接,确保引用的完整性。外键指向另一个表的主键或唯一键。
特性 | 说明 |
---|---|
关键字 | FOREIGN KEY (col_name) REFERENCES parent_table(pk_col) |
作用 | 确保外键列的值必须在被引用表的主键/唯一键中存在,或为 NULL |
参照完整性 | 防止出现“孤儿记录”(如订单对应一个不存在的用户) |
级联操作 | 支持 ON DELETE CASCADE 、ON UPDATE CASCADE 等,自动同步删除或更新 |
示例 | user_id INT, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL |
存储引擎 | 仅 InnoDB 存储引擎支持外键 |
5. 检查约束 (CHECK)
检查约束用于限制列中可接受的值范围或条件表达式。
特性 | 说明 |
---|---|
关键字 | CHECK (condition) |
功能 | 定义一个逻辑表达式,插入或更新时必须满足该条件 |
支持版本 | MySQL 8.0.16+ 才开始真正强制执行 CHECK 约束(早期版本仅解析语法,不执行) |
示例 | age INT CHECK (age >= 0 AND age <= 150) status ENUM('active','inactive') CHECK (status IN ('active','inactive')) |
灵活性 | 可用于复杂条件验证 |
6. 默认约束 (DEFAULT)
默认约束为列指定一个默认值,当插入数据时未提供该列的值,则自动使用默认值。
特性 | 说明 |
---|---|
关键字 | DEFAULT value |
作用 | 简化插入操作,避免频繁输入重复值 |
支持类型 | 可以是常量、表达式(如 CURRENT_TIMESTAMP )、函数等 |
示例 | created_at DATETIME DEFAULT CURRENT_TIMESTAMP status TINYINT DEFAULT 1 country VARCHAR(50) DEFAULT 'China' |
与 NOT NULL 组合 | 常与 NOT NULL 一起使用,确保字段总有值 |
7. 约束对比
约束类型 | 关键字 | 是否允许 NULL | 是否要求唯一 | 是否自动创建索引 | 典型用途 |
---|---|---|---|---|---|
主键 | PRIMARY KEY | ❌ 不允许 | ✅ 唯一 | ✅ 是(PRIMARY) | 唯一标识记录 |
非空 | NOT NULL | ❌ 不允许 | ❌ 不要求 | ❌ 否 | 强制必填字段 |
唯一 | UNIQUE | ✅ 允许(通常最多一个) | ✅ 唯一 | ✅ 是(UNIQUE) | 字段值全局唯一 |
外键 | FOREIGN KEY | ✅ 可配置 | ❌ 不要求 | ✅ 是(自动创建) | 表间关联,引用完整性 |
检查 | CHECK() | 取决于条件 | 取决于条件 | ❌ 否 | 值范围或逻辑校验 |
默认 | DEFAULT | 取决于值 | ❌ 不要求 | ❌ 否 | 提供默认值 |
三、数据表基本操作
数据表是MySQL数据库中存储和管理数据的核心对象。掌握数据表的创建、修改、删除和查看等基本操作,是进行数据库开发与管理的必备技能。
1. 创建数据表
创建数据表是数据库设计的首要步骤。在MySQL中,使用 CREATE TABLE
语句来定义一个新表的结构,包括表名、字段、数据类型以及各种约束条件。
1.1 创建数据表语法及解释
CREATE TABLE
语句是创建新表的核心命令。其简洁语法结构如下:
CREATE TABLE [IF NOT EXISTS] table_name (column1_name column1_type [column1_constraints],column2_name column2_type [column2_constraints],column3_name column3_type [column3_constraints],...-- 表级约束(可选)[table_constraint_definition]
)
-- 表选项(可选)
[table_options];
其完整语法结构如下:
CREATE TABLE [IF NOT EXISTS] table_name (-- 列定义:名称、类型、列级约束(可选)column1_name column1_type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY]] [PRIMARY KEY] [COMMENT 'column_comment'],column2_name column2_type [NOT NULL | NULL][DEFAULT default_value][AUTO_INCREMENT][UNIQUE [KEY]][PRIMARY KEY][COMMENT 'column_comment'],...-- 表级约束(可选,多列联合约束常用)[CONSTRAINT constraint_name] PRIMARY KEY (column1, column2, ...), -- 联合主键[CONSTRAINT constraint_name] UNIQUE [KEY] (column1, column2, ...), -- 联合唯一[CONSTRAINT constraint_name] FOREIGN KEY (column) REFERENCES parent_table (parent_column)[ON DELETE {CASCADE | SET NULL | RESTRICT | NO ACTION}][ON UPDATE {CASCADE | SET NULL | RESTRICT | NO ACTION}],[CONSTRAINT constraint_name] CHECK (condition) -- 自定义条件约束(如 age > 0)
)-- 表选项(可选)
[ENGINE = storage_engine] -- 存储引擎(如 InnoDB、MyISAM)
[DEFAULT CHARSET = charset_name] -- 字符集(如 utf8mb4)
[COLLATE = collation_name] -- 排序规则(如 utf8mb4_general_ci)
[AUTO_INCREMENT = initial_value] -- 自增起始值
[COMMENT = 'table_comment'] -- 表注释
[ROW_FORMAT = {DYNAMIC | FIXED | COMPRESSED}] -- 行格式(InnoDB 适用)
[PARTITION BY partition_type (partition_expression) -- 分区表定义(可选)PARTITIONS partition_countSUBPARTITION BY subpartition_type (subpartition_expression)SUBPARTITIONS subpartition_count];
下面对语法中的各个部分进行详细解释:
语法元素 | 说明 | 是否必需 | 示例 |
---|---|---|---|
CREATE TABLE | SQL关键字,用于声明创建一个新表。 | ✅ 必需 | CREATE TABLE users (...); |
IF NOT EXISTS | 可选子句。如果数据库中已存在同名表,则不会执行创建操作,也不会报错(仅提示警告)。在编写初始化脚本时强烈推荐使用,避免重复执行导致错误。 | ❌ 可选 | CREATE TABLE IF NOT EXISTS users (...); |
table_name | 要创建的表的名称。命名应遵循规范: - 使用小写字母 - 单词间用下划线 _ 分隔(如 user_info )- 避免使用MySQL关键字(如 order , group )- 名称应具有业务含义 | ✅ 必需 | users , product_category , order_details |
column_name | 列(字段)的名称。同样需要遵循命名规范。 | ✅ 必需(每个列) | id , username , created_at |
column_type | 列的数据类型,决定了该列可以存储的数据种类和范围。例如 INT , VARCHAR(50) , DATETIME , TEXT 等。选择合适的数据类型至关重要。 | ✅ 必需(每个列) | INT , VARCHAR(100) , DECIMAL(10,2) |
column_constraints | 列级约束,直接定义在列后的约束条件。常见的有: - NOT NULL :非空约束- NULL :允许为空(默认)- DEFAULT value :默认值- UNIQUE :唯一约束- PRIMARY KEY :主键约束(通常在单列上)- AUTO_INCREMENT :自动递增(仅限整数类型)- COMMENT 'text' :列注释 | ❌ 可选 | username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名' |
table_constraint_definition | 表级约束,在所有列定义之后,单独一行定义的约束。适用于多列组合的约束: - PRIMARY KEY (col1, col2) :复合主键- UNIQUE (col1, col2) :联合唯一- FOREIGN KEY (col) REFERENCES other_table(pk_col) :外键约束- CHECK (condition) :检查约束 | ❌ 可选 | PRIMARY KEY (user_id, role_id) ,FOREIGN KEY (dept_id) REFERENCES departments(id) |
table_options | 表的附加选项,定义表的物理存储和行为: - ENGINE = engine_name :指定存储引擎(如 InnoDB , MyISAM )。推荐使用 InnoDB ,支持事务和外键。- DEFAULT CHARSET = charset_name :指定默认字符集(如 utf8mb4 )。强烈推荐使用 utf8mb4 以支持emoji等4字节字符。- COLLATE = collation_name :指定排序规则(如 utf8mb4_unicode_ci ,不区分大小写)。- COMMENT = 'text' :为表添加注释。 | ❌ 可选(但强烈建议指定) | ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户表' |
1.2 语法使用要点总结
- 括号与逗号:所有列定义必须包含在一对圆括号
()
内。列与列之间用逗号,
分隔,最后一列后不能有逗号。 - 约束位置:
- 单列约束(如
NOT NULL
,DEFAULT
,UNIQUE
)可以直接写在列定义后。 - 多列组合约束(如复合主键、联合唯一、外键)必须在所有列定义之后,作为独立的语句行。
- 单列约束(如
- 主键定义:
- 如果主键是单列,可以直接在列后加
PRIMARY KEY
。 - 如果主键是多列(复合主键),必须在表级约束中定义
PRIMARY KEY (col1, col2)
。
- 如果主键是单列,可以直接在列后加
- 自增主键:
AUTO_INCREMENT
通常与INT
或BIGINT
类型的主键一起使用,确保主键值自动递增且唯一。 - 字符集与排序规则:在现代应用中,必须设置
CHARSET = utf8mb4
和合适的COLLATE
,以避免中文乱码和emoji存储问题。 - 注释:使用
COMMENT
为表和重要字段添加描述,是良好的数据库设计实践,有助于团队协作和后期维护。
1.3 创建数据表示例
1.3.1 创建带有所有约束条件及表选项的数据表
-- 创建电商订单表
CREATE TABLE IF NOT EXISTS `ecommerce_orders` (-- 订单ID(主键,自增)order_id BIGINT NOT NULL AUTO_INCREMENT COMMENT '订单唯一标识',-- 用户ID(外键关联用户表,非空)user_id INT NOT NULL COMMENT '下单用户ID',-- 订单编号(唯一,非空,业务唯一标识)order_no VARCHAR(32) NOT NULL COMMENT '订单编号(格式:YYYYMMDD+随机数)',-- 订单总金额(非空,默认0.00,需≥0)total_amount DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '订单总金额(元)',-- 支付状态(非空,默认0,仅允许特定值)pay_status TINYINT NOT NULL DEFAULT 0 COMMENT '支付状态(0-未支付,1-已支付,2-退款中,3-已退款)',-- 支付时间(可为空,支付后更新)pay_time DATETIME NULL COMMENT '支付完成时间',-- 收货地址ID(非空,关联地址表)address_id BIGINT NOT NULL COMMENT '收货地址ID',-- 订单备注(可为空,最长500字)remark VARCHAR(500) NULL COMMENT '用户订单备注',-- 订单创建时间(非空,默认当前时间)create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '订单创建时间',-- 订单更新时间(非空,自动更新)update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '订单最后更新时间',-- 表级约束(多列约束或命名约束)-- 1. 主键约束(与列级主键二选一,此处用表级约束示例)CONSTRAINT pk_order_id PRIMARY KEY (order_id),-- 2. 唯一约束(确保订单编号不重复,命名便于后期维护)CONSTRAINT uk_order_no UNIQUE KEY (order_no),-- 3. 检查约束(限制金额≥0,状态值在合法范围)CONSTRAINT chk_total_amount CHECK (total_amount >= 0),CONSTRAINT chk_pay_status CHECK (pay_status IN (0, 1, 2, 3))
)
-- 表选项配置
ENGINE = InnoDB -- 存储引擎(支持事务、外键)
DEFAULT CHARSET = utf8mb4 -- 字符集(支持emoji)
COLLATE = utf8mb4_general_ci -- 排序规则(不区分大小写)
AUTO_INCREMENT = 100000 -- 自增起始值(从10万开始)
COMMENT = '电商平台订单主表' -- 表注释
ROW_FORMAT = DYNAMIC; -- 行格式(InnoDB动态行格式,节省空间)
1.3.2 创建学生课程及其关系表
创建学生数据表:
-- 1. 学生表(主表)
CREATE TABLE IF NOT EXISTS `student` (student_id INT NOT NULL AUTO_INCREMENT COMMENT '学生ID(主键)',student_no VARCHAR(20) NOT NULL COMMENT '学号(唯一标识,如2024001)',student_name VARCHAR(50) NOT NULL COMMENT '学生姓名',gender CHAR(1) NOT NULL COMMENT '性别(男/女)',birth_date DATE NULL COMMENT '出生日期',major VARCHAR(50) NOT NULL COMMENT '所属专业',enroll_date DATE NOT NULL COMMENT '入学时间',create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',-- 列级约束PRIMARY KEY (student_id),UNIQUE KEY uk_student_no (student_no), -- 学号唯一CHECK (gender IN ('男', '女')) -- 限制性别只能是男或女
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci
AUTO_INCREMENT = 1001 -- 学生ID从1001开始
COMMENT = '学生信息表';
创建课程数据表:
-- 2. 课程表(主表)
CREATE TABLE IF NOT EXISTS `course` (course_id INT NOT NULL AUTO_INCREMENT COMMENT '课程ID(主键)',course_no VARCHAR(20) NOT NULL COMMENT '课程编号(如CS101)',course_name VARCHAR(100) NOT NULL COMMENT '课程名称',credit TINYINT NOT NULL COMMENT '学分(1-6分)',teacher_name VARCHAR(50) NOT NULL COMMENT '授课教师',course_hours INT NOT NULL COMMENT '课时数',create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',-- 列级约束PRIMARY KEY (course_id),UNIQUE KEY uk_course_no (course_no), -- 课程编号唯一CHECK (credit BETWEEN 1 AND 6), -- 学分范围限制CHECK (course_hours > 0) -- 课时必须为正数
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci
AUTO_INCREMENT = 101 -- 课程ID从101开始
COMMENT = '课程信息表';
创建学生和课程关系数据表:
-- 3. 选课表(关系表,关联学生表和课程表)
CREATE TABLE IF NOT EXISTS `student_course` (id INT NOT NULL AUTO_INCREMENT COMMENT '选课记录ID(主键)',student_id INT NOT NULL COMMENT '学生ID(外键关联学生表)',course_id INT NOT NULL COMMENT '课程ID(外键关联课程表)',select_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '选课时间',score DECIMAL(5,2) NULL COMMENT '课程成绩(0-100分,NULL表示未考试)',is_valid TINYINT NOT NULL DEFAULT 1 COMMENT '是否有效(1-有效,0-已退课)',-- 表级约束PRIMARY KEY (id),-- 联合唯一约束:同一学生不能重复选同一门课UNIQUE KEY uk_stu_course (student_id, course_id),-- 外键约束:关联学生表CONSTRAINT fk_sc_student FOREIGN KEY (student_id)REFERENCES `student`(student_id)ON DELETE CASCADE -- 学生记录删除时,关联的选课记录自动删除ON UPDATE CASCADE, -- 学生ID更新时,选课记录同步更新-- 外键约束:关联课程表CONSTRAINT fk_sc_course FOREIGN KEY (course_id)REFERENCES `course`(course_id)ON DELETE CASCADE -- 课程记录删除时,关联的选课记录自动删除ON UPDATE CASCADE,-- 检查约束:成绩范围限制(0-100分)CONSTRAINT chk_score CHECK (score IS NULL OR (score BETWEEN 0 AND 100)),-- 检查约束:is_valid只能是0或1CONSTRAINT chk_is_valid CHECK (is_valid IN (0, 1))
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci
COMMENT = '学生选课关系表';
2. 查看数据表
在创建数据表之后,经常需要查看表的结构、状态或列表信息,以确认表是否按预期创建,或了解现有表的详细信息。MySQL提供了多种命令来满足不同的查看需求。
2.1 查看数据库中的所有数据表
查看当前数据库所有表:
SHOW TABLES;
查看指定数据库所有表:
SHOW TABLES FROM database_name;
示例:查看数据库test001
的所有表。
SHOW TABLES FROM test001;
2.2 查看数据表的创建语句
SHOW CREATE TABLE table_name;
示例:查看数据表student
的建表语句。
SHOW CREATE TABLE student;
2.3 查看数据表的结构(字段信息)
DESCRIBE table_name;
-- 或
DESC table_name;
示例:查看数据表student
的结构。
DESC student;
输出字段解释:
列名 (Field) | 说明 |
---|---|
Field | 列(字段)的名称。 |
Type | 该列的数据类型。 |
Null | 是否允许存储 NULL 值。NO 表示不允许(即有 NOT NULL 约束),YES 表示允许。 |
Key | 索引信息: - PRI :主键(Primary Key)- UNI :唯一索引(Unique Key)- MUL :普通索引(允许重复值)- 空:无索引 |
Default | 该列的默认值。如果未设置则为 NULL 。 |
Extra | 额外信息,如 auto_increment (自增)、on update CURRENT_TIMESTAMP (更新时自动更新时间)等。 |
2.4 使用 SHOW COLUMNS
查看更详细信息
SHOW COLUMNS
命令与 DESCRIBE
功能几乎完全相同,是另一种查看表结构的方式。
SHOW COLUMNS FROM table_name;
-- 可以指定数据库
SHOW COLUMNS FROM table_name FROM database_name;
2.5 查看表的状态信息
使用 SHOW TABLE STATUS
命令可以查看表的详细运行时状态,包括行数、数据大小、索引大小、创建时间等,对性能调优和空间管理很有帮助。
SHOW TABLE STATUS LIKE 'table_name';
-- 或查看所有表
SHOW TABLE STATUS;
示例:查看数据表student
的状态。
SHOW TABLE STATUS LIKE 'student'
3. 修改数据表
3.1 重命名表名
3.1.1 语法
ALTER TABLE old_table_name RENAME [TO | AS] new_table_name;
3.1.2 示例
将表 student
重命名为 student_info
:
ALTER TABLE student RENAME TO student_info;
将表 student_info
重命名为 student
:
ALTER TABLE student_info RENAME AS student;
3.2 添加字段和约束
3.2.1 语法
添加字段:
ALTER TABLE table_name
ADD [COLUMN] column_name column_definition [FIRST | AFTER existing_column];
column_definition
: 包含数据类型及约束(如VARCHAR(100) NOT NULL DEFAULT ''
)。FIRST
: 将新列添加为表的第一列。AFTER existing_column
: 将新列添加到指定列之后。默认添加到末尾。
添加约束:
ALTER TABLE table_name
ADD CONSTRAINT constraint_name constraint_definition;
常见的 constraint_definition
:
- 主键:
PRIMARY KEY (col1, col2)
- 唯一键:
UNIQUE [INDEX] index_name (col_list)
- 外键:
FOREIGN KEY (col) REFERENCES parent_table(pk_col) [ON DELETE action]
3.2.2 示例
添加字段:在 student
表的 create_time
列后添加一个 update_time
字段。
ALTER TABLE student ADD COLUMN update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER create_time;
添加唯一约束:为 student
表的 student_name
列添加唯一性约束。
ALTER TABLE student ADD UNIQUE uk_student_name (student_name);
3.3 重命名列名
3.3.1 语法
ALTER TABLE table_name
CHANGE [COLUMN] old_column_name new_column_name column_definition [FIRST | AFTER existing_column];
old_column_name
: 原列名。new_column_name
: 新列名。column_definition
: 必须重新指定该列的完整定义(数据类型、约束等),即使保持不变。
3.3.2 示例
将 student
表中的 student_name
列重命名为 s_name
,并保持其定义不变:
ALTER TABLE student CHANGE student_name s_name VARCHAR(50) NOT NULL COMMENT '学生姓名';
3.4 修改列定义
如果只想修改列的数据类型或约束,而不改变列名,使用 MODIFY
子句。
3.4.1 语法
ALTER TABLE table_name
MODIFY [COLUMN] column_name new_column_definition [FIRST | AFTER existing_column];
3.4.2 示例
将 student
表中 s_name
列的长度从 50
扩展到 64
:
ALTER TABLE student MODIFY s_name VARCHAR(64) NOT NULL COMMENT '学生姓名';
3.5 删除字段和约束
3.5.1 语法
删除字段:
ALTER TABLE table_name
DROP [COLUMN] column_name;
删除主键约束:
ALTER TABLE table_name
DROP PRIMARY KEY;
删除唯一键约束/索引:
ALTER TABLE table_name
DROP INDEX index_name;
删除外键约束:
ALTER TABLE table_name
DROP FOREIGN KEY fk_constraint_name;
3.5.2 示例
删除字段:删除 student
表中的 update_time
列。
ALTER TABLE student DROP COLUMN update_time;
删除唯一约束:删除之前创建的 uk_student_name
唯一索引。
ALTER TABLE student DROP INDEX uk_student_name;
4. 删除数据表
当某个数据表不再需要时,可以将其从数据库中彻底删除。MySQL使用 DROP TABLE
语句来完成此操作。这是一个不可逆的操作,执行后表的结构和所有数据都将被永久删除,因此必须谨慎使用。
4.1 删除数据表语法
DROP TABLE [IF EXISTS] table_name [, table_name2, ...] [RESTRICT | CASCADE];
解释:
语法元素 | 说明 | 是否必需 |
---|---|---|
DROP TABLE | SQL关键字,用于声明删除一个或多个表。 | ✅ 必需 |
IF EXISTS | 可选子句。如果指定,当要删除的表不存在时,MySQL不会报错,只会发出一个 NOTE 级别的提示。在编写自动化脚本或初始化脚本时强烈推荐使用,避免因表不存在而导致后续操作中断。 | ❌ 可选(但强烈建议使用) |
table_name | 要删除的表的名称。可以一次删除多个表,表名之间用逗号 , 分隔。 | ✅ 必需 |
RESTRICT | 指定删除行为。RESTRICT (默认行为)表示如果该表被其他表的外键所引用,则禁止删除,以保护数据完整性。 | ❌ 可选(默认) |
CASCADE | 如果该表被其他表的外键引用,CASCADE 会自动级联删除所有引用该表的外键约束,然后删除该表。此操作非常危险,会破坏数据库的参照完整性,除非明确需要,否则不建议使用。 | ❌ 可选 |
4.2 示例
删除ecommerce_orders
表,如果存在才删除。
DROP TABLE IF EXISTS ecommerce_orders;