当前位置: 首页 > news >正文

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. 数字类型

类型存储空间有符号范围无符号范围说明
TINYINT1 字节-128 到 1270 到 255最小整数类型,适合状态标志位(如:0/1)
SMALLINT2 字节-32,768 到 32,7670 到 65,535小范围整数
MEDIUMINT3 字节-8,388,608 到 8,388,6070 到 16,777,215中等范围整数
INT / INTEGER4 字节-2,147,483,648 到 2,147,483,6470 到 4,294,967,295最常用的标准整数类型
BIGINT8 字节-2⁶³ 到 2⁶³-10 到 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. 时间日期类型

类型格式范围存储空间说明
DATEYYYY-MM-DD'1000-01-01''9999-12-31'3 字节仅日期
TIMEHH:MM:SS[.fraction]'-838:59:59''838:59:59'3 字节(不含微秒)仅时间,可表示时间间隔
DATETIMEYYYY-MM-DD HH:MM:SS[.fraction]'1000-01-01 00:00:00''9999-12-31 23:59:59'5 字节(不含微秒)日期和时间,与时区无关
TIMESTAMPYYYY-MM-DD HH:MM:SS[.fraction]'1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC4 字节(不含微秒)自动转换为UTC存储,受时区影响
YEARYYYY190121551 字节年份,通常用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,根据范围选择 TINYINTBIGINT
  • 字符串:优先使用 VARCHAR,避免滥用 TEXT
  • 精确数值:必须使用 DECIMAL,避免用 FLOAT/DOUBLE 存储金额。
  • 日期时间:一般使用 DATETIME,需要自动时区转换时用 TIMESTAMP
  • 状态/选项:考虑 ENUMSET 以提高效率和数据完整性。

二、约束条件

在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
灵活性可以与其他约束(如 UNIQUEDEFAULT)组合使用
示例name VARCHAR(50) NOT NULL
email VARCHAR(100) NOT NULL
注意如果未设置默认值且没有提供数据,插入时会报错

3. 唯一约束 (UNIQUE)

唯一约束确保某列(或列组合)中的所有值都是唯一的,但允许存在 NULL 值(NULL 被视为“未知”,多个 NULL 不违反唯一性)。

特性说明
关键字UNIQUEUNIQUE 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 CASCADEON 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 TABLESQL关键字,用于声明创建一个新表。✅ 必需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 语法使用要点总结

  1. 括号与逗号:所有列定义必须包含在一对圆括号 () 内。列与列之间用逗号 , 分隔,最后一列后不能有逗号
  2. 约束位置
    • 单列约束(如 NOT NULL, DEFAULT, UNIQUE)可以直接写在列定义后。
    • 多列组合约束(如复合主键、联合唯一、外键)必须在所有列定义之后,作为独立的语句行。
  3. 主键定义
    • 如果主键是单列,可以直接在列后加 PRIMARY KEY
    • 如果主键是多列(复合主键),必须在表级约束中定义 PRIMARY KEY (col1, col2)
  4. 自增主键AUTO_INCREMENT 通常与 INTBIGINT 类型的主键一起使用,确保主键值自动递增且唯一。
  5. 字符集与排序规则:在现代应用中,必须设置 CHARSET = utf8mb4 和合适的 COLLATE,以避免中文乱码和emoji存储问题。
  6. 注释:使用 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 TABLESQL关键字,用于声明删除一个或多个表。✅ 必需
IF EXISTS可选子句。如果指定,当要删除的表不存在时,MySQL不会报错,只会发出一个 NOTE 级别的提示。在编写自动化脚本或初始化脚本时强烈推荐使用,避免因表不存在而导致后续操作中断。❌ 可选(但强烈建议使用)
table_name要删除的表的名称。可以一次删除多个表,表名之间用逗号 , 分隔。✅ 必需
RESTRICT指定删除行为。RESTRICT(默认行为)表示如果该表被其他表的外键所引用,则禁止删除,以保护数据完整性。❌ 可选(默认)
CASCADE如果该表被其他表的外键引用,CASCADE自动级联删除所有引用该表的外键约束,然后删除该表。此操作非常危险,会破坏数据库的参照完整性,除非明确需要,否则不建议使用❌ 可选

4.2 示例

删除ecommerce_orders表,如果存在才删除。

DROP TABLE IF EXISTS ecommerce_orders;
http://www.dtcms.com/a/465018.html

相关文章:

  • 商丘网站建设大全网站改版 大量旧页面
  • 简单网站编写
  • 用AI写的【实时文件搜索引擎】python源码【找资源】
  • 无为建设局网站深圳东门解封了吗
  • 【Linux】入门指南:基础指令详解Part Two
  • 如何下载 Git 仓库中的所有分支到本地并实现Python自动化操作
  • 掌握前后端数据交互的3种核心方式
  • 网络、主机安全扫描工具
  • 论文笔记 -《MUON IS SCALABLE FOR LLM TRAINING》
  • soular入门到实战(6) - soular+kanass+sward+postin实现sso单点登录
  • 建设农垦网站赣州网站制作
  • vue3 el-date-picker 日期选择器校验规则-选择日期范围不能超过七天
  • 【论文阅读】Debating with More Persuasive LLMs Leads to More Truthful Answers
  • Windows系统中部署GeoServer全流程
  • 成都专做婚介网站的公司温州做外贸网站
  • OpenWrt开发第13篇:OpenWrt上读取带USB接口的GPS设备信息
  • 公司如何建设网站首页品牌建设网站公司排名
  • MySQL的查询操作语法要点
  • 打工人日报#20251010
  • ARMv8系统的安全性(二):TrustZone架构如何重塑移动设备安全生态
  • Vivado 时序约束的完整作战地图(二)
  • 使用主流开发语言的项目如何一键生成SBOM文件?
  • Java常见业务场景之大量数据存储优化:从 Mysql 到 Redis Bitmap ,实现高效存储用户签到记录
  • 朝阳企业网站建设方案费用东莞公司注册
  • 光影魔术手_4.7.2.1192|win中文|图像修改编辑器|安装教程
  • c++ bug 记录(merge函数调用时错误地传入了vector对象而非迭代器。)
  • 珠海网站专业制作wordpress 折线图
  • css、dom 性能优化方向
  • 【大前端】Android Deep Link 技术详解与实践指南
  • Linux操作系统如何使用ISO镜像文件来搭建本地镜像源?